22

在clojure中,我想知道以下三个之间有什么区别。

(println (map + '(1 2 3) '(4 5 6))) 

(println (map '+ '(1 2 3) '(4 5 6))) 

(println (map #'+ '(1 2 3) '(4 5 6))) 

结果是

(5 7 9) 

(4 5 6) 

(5 7 9) 

我无法理解第二个人的行为。

我觉得第一个和第三个在 clojure 中是相同的,它是 Lisp-1,并且不区分评估变量和同名函数。

这可能是一个基本问题,但似乎没有足够的信息。请教我。

谢谢。

4

1 回答 1

35

关于第三种情况,与 Common Lisp 相比,#'+它不会读取(function +)和引用+函数命名空间中符号的值,因为 Clojure 没有函数命名空间。相反,它读作(var +)并引用被var调用的+. 应用 avar与应用存储在 中的值相同var

在第二种情况下,您重复地将符号应用于一对数字。这是偶然有效的。将符号应用于地图与在地图中建立索引相同:

user> ('a {'a 1, 'b 2, 'c 3, '+ 4})
1
user> ('+ {'a 1, 'b 2, 'c 3, '+ 4})
4

如果您提供第二个参数,它将用作默认值,以防在映射中找不到匹配的键:

user> ('+ {'a 1, 'b 2, 'c 3} 4)
4

由于在每次迭代中,您将符号+应用于一对数字,并且由于数字不是映射,因此不包含+作为键,因此第二个参数作为失败匹配的默认值返回。

user> ('+ 'foo 4)
4
user> ('+ {} 4)
4
user> ('+ 1 4)
4
于 2012-03-18T17:41:37.387 回答