Clojure中,函数、引用函数和尖引号函数之间的区别

2024-03-24

在 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(使用前将#替换为@)

Clojure中,函数、引用函数和尖引号函数之间的区别 的相关文章

随机推荐