我理解apply如何在这样的简单表达式中起作用:
(apply + '(1 2 3))
在我正在阅读的一本书中,我遇到了一个更复杂的例子。
(def make
(fn [class & args]
(let [seeded {:__class_symbol__ (:__own_symbol__ class)}
constructor (:add-instance-values (:__instance_methods__ class))]
(apply constructor seeded args))))
在上面的例子中,seeded是一个map,args是一个ArraySeq。
任何人都可以解释申请在这种情况下是如何运作的吗?
答案 0 :(得分:6)
在这种情况下,(apply constructor seeded args)
相当于调用(constructor seeded arg0 arg1 arg2 ...)
。它会打开最后一个参数(必须是seqable)并在评估之前逐个将它们附加到列表中。
例如,这:(apply + 1 [2 3])
展开到(+ 1 2 3)
。
似乎类似于:
((make) MyClass)
相当于new MyClass()
((make) MyClass "foo" "bar" 3)
相当于new MyClass("foo", "bar", 3)