我需要在clojure中创建并填充ArrayList并将其传递给Java API.有人可以帮助解释为什么以下两种方法存在差异(以及为什么其中一种方法不起作用).
;;; this works
(defn make-an-array-list []
(let [alist (java.util.ArrayList.)]
(loop [x 0] (when (< x 6) (.add alist x) (recur (inc x)))) alist))
;;; ==> [0 1 2 3 4 5]
;;; this does not work
(defn make-an-array-list2 []
(let [alist (java.util.ArrayList.)]
(for [n (range 6)] (.add alist n)) alist))
;;; ==> []
Run Code Online (Sandbox Code Playgroud)
或者,是否有任何建议而不是上述方法?
需要实现如下的决策表:
MemberType Amount => Discount
"Guest" > 2000 => 3%
"Silver" any => 5%
"Silver" > 1000 => 10%
"Gold" any => 15%
"Gold" > 500 => 20%
Run Code Online (Sandbox Code Playgroud)
我想,如果在Clojure中正确实现,我们可以定义一个规则表,如下所示:
(defrule calc-discount
[member-type amount]
"Guest" (greater-than 2000) => 0.03
"Silver" (anything) => 0.05
"Silver" (greater-than 1000) => 0.1
"Gold" (anything) => 0.15
"Gold" (greater-than 500) => 0.2
)
Run Code Online (Sandbox Code Playgroud)
当然,在编写/定义这样的规则集时应该有更好的方法.然而,我认为关键是如何定义"defrule"来实现这一目标?