Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure-解释';应用';关于这点_Clojure - Fatal编程技术网

clojure-解释';应用';关于这点

clojure-解释';应用';关于这点,clojure,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如何在这样一个简单的表达式中工作:

(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

有人能解释一下应用程序在这种情况下是如何工作的吗?

在这种情况下
(应用构造函数种子参数)
相当于调用
(构造函数种子参数arg0 arg1 arg2…
)。它打开最后一个参数(必须是seqable)并在计算之前将它们逐个附加到列表中

例如,此:
(应用+1[23])
展开到
(+1 2 3)

这似乎类似于:

  • ((make)MyClass)
    相当于
    新的MyClass()
  • ((make)MyClass“foo”“bar”3)
    相当于
    新MyClass(“foo”“bar”,3)
在这种情况下,
(应用构造函数种子参数)
相当于调用
(构造函数种子参数arg0 arg1 arg2…
)。它打开最后一个参数(必须是seqable)并在计算之前将它们逐个附加到列表中

例如,此:
(应用+1[23])
展开到
(+1 2 3)

这似乎类似于:

  • ((make)MyClass)
    相当于
    新的MyClass()
  • ((make)MyClass“foo”“bar”3)
    相当于
    新MyClass(“foo”“bar”,3)

这个答案几乎是正确的。但是,“应用”仅打开最后一个参数,而不是全部参数。试试(应用+1[23][45]),看看它会不会起作用。@NielsK说得好,我不知道。在本例中也是一样的(有2个参数),但在更多方面你是对的。谢谢。这个答案几乎是对的。但是,“应用”仅打开最后一个参数,而不是全部参数。试试(应用+1[23][45]),看看它会不会起作用。@NielsK说得好,我不知道。在本例中也是一样的(有2个参数),但在更多方面你是对的。非常感谢。