在 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
并且不区分评估变量和同名函数。
这可能是一个基本问题,但似乎没有足够的信息。请教我。
Thanks.
对于第三种情况,与 Common Lisp 相比,#'+
不读为(function +)
并参考符号的值+
在函数命名空间中,因为 Clojure 没有函数命名空间。相反,它读作(var +)
并指的是var
called +
。应用一个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
因为在每次迭代中,您都应用符号+
到一对数字,并且由于数字不是地图,因此不包含+
作为键,第二个参数作为失败匹配的默认值返回。
user> ('+ 'foo 4)
4
user> ('+ {} 4)
4
user> ('+ 1 4)
4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)