在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 并且不区分评估变量和同名函数。
这可能是一个基本问题,但似乎没有足够的信息。请教我。
感谢。
答案 0 :(得分:33)
关于第三种情况,与Common Lisp相比,#'+
不会读作(function +)
并且在函数名称空间中引用符号+
的值,因为Clojure不会有一个函数命名空间。相反,它显示为(var +)
并引用名为var
的{{1}}。应用+
与应用var
中存储的值相同。
在第二种情况下,您重复将符号应用于一对数字。这是偶然的。将符号应用于地图与索引到该地图相同:
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
应用于一对数字,并且由于数字不是映射,因此不包含+
作为键,因此第二个参数将作为失败匹配的默认值返回。
+