Function 克洛尤尔先休息
为什么我会得到两个不同的值Function 克洛尤尔先休息,function,clojure,symbols,Function,Clojure,Symbols,为什么我会得到两个不同的值 (apply (first '(+ 1 2)) (rest '(+ 1 2))) > 2 及 什么时候 及 我试着减少,得到了同样的值 (reduce (first '(+ 1 2)) (rest '(+ 1 2))) > 2 (第一个“(+12))是一个符号 user=> (class (first '(+ 1 2))) clojure.lang.Symbol user=> (apply (symbol "+") [1 2]) 2 use
(apply (first '(+ 1 2)) (rest '(+ 1 2)))
> 2
及
什么时候
及
我试着减少,得到了同样的值
(reduce (first '(+ 1 2)) (rest '(+ 1 2)))
> 2
(第一个“(+12))是一个符号
user=> (class (first '(+ 1 2)))
clojure.lang.Symbol
user=> (apply (symbol "+") [1 2])
2
user=> (apply (eval (symbol "+")) [1 2])
3
user=> (apply (eval (first '(+ 1 2))) (rest '(+ 1 2)))
3
user=> (class (first [+ 1 2]))
clojure.core$_PLUS_
user=> (apply (first [+ 1 2]) (rest '(+ 1 2)))
3
您的问题是您试图调用符号
'+
,而不是函数+
。调用符号时,它会尝试在第一个参数中查找符号(例如,如果它是{'a1'+5'b2}
,则会得到5
)。如果传递第二个参数,如果在第一个参数中找不到符号,则返回该值,而不是nil
。因此,当您调用('+12)
,它尝试在1中查找'+
,但失败,因此返回2
顺便说一句,这就是使用'(+12)
和(list+12)
创建列表的区别。前者创建符号+、1和2的列表。因为1和1是一样的,没关系。但是符号“+”不是Var clojure.core/+,因此后者获取Var的值,而前者仅获取符号。因此,如果您完成了(list+12)
,您的代码就可以像编写的那样工作了
(rest '(+ 1 2))
> (1 2)
(reduce (first '(+ 1 2)) (rest '(+ 1 2)))
> 2
user=> (class (first '(+ 1 2)))
clojure.lang.Symbol
user=> (apply (symbol "+") [1 2])
2
user=> (apply (eval (symbol "+")) [1 2])
3
user=> (apply (eval (first '(+ 1 2))) (rest '(+ 1 2)))
3
user=> (class (first [+ 1 2]))
clojure.core$_PLUS_
user=> (apply (first [+ 1 2]) (rest '(+ 1 2)))
3