clojure - 解释'适用'在这种背景下

时间:2014-07-09 08:16:32

标签: clojure

我理解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。

任何人都可以解释申请在这种情况下是如何运作的吗?

1 个答案:

答案 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)