在Clojure中,函数,引用函数和锐引函数之间的区别

时间:2012-03-18 17:26:17

标签: function clojure quote

在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 并且不区分评估变量和同名函数。

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

感谢。

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 应用于一对数字,并且由于数字不是映射,因此不包含+作为键,因此第二个参数将作为失败匹配的默认值返回。

+