为什么Clojure中的符号可以用作函数?

3
我为您提供以下简短代码:

我为您提供以下简短代码:

('a 1)
;==> nil
('a 1 2)
;=>2

为什么在这个情境中符号 a 可以被用作函数?

我完全理解Clojure中符号解析的工作原理。但是我不明白为什么一个符号(绑定或未绑定)会像一个函数一样运行。 - user3228423
我检查了这两篇文章,发现符号和关键字可以用作函数,在映射中执行查找。但是为什么上面的代码能够工作呢?因为它不应该工作。 - user3228423
为什么?最简单的答案是因为clojure.lang.Symbol实现了IFn接口。使用它的规则是什么?请参见Chiron的上面链接。他们为什么选择让符号以那种方式行事?为了方便。 - noisesmith
@user3228423 是的,在你的例子中,1是映射表,2是“未找到”的默认值。只要1不是映射表,就会返回未找到的2。 - guilespi
如果你想理解这种行为,请看 get。一个作为函数使用的符号实际上调用了 get,而 get 将接受任何东西作为第一个参数,如果无法从中获取任何内容,则简单地返回默认值。(get Double/NaN :a :default) => :default - noisesmith
以上内容在A. Webb的链接中提到。 - noisesmith
1个回答

2

它允许您使用符号作为键,在漂亮的语法中查找地图。

以下是等效的:

('a my-hash-map)
(get my-hash-map 'a)  ; returns value associated with 'a or nil if not present

为了进一步方便,您还可以将默认值作为可选的第二个参数提供:

('a my-hash-map 42)  ; returns 42 if my-hash-map does't have the key 'a

关于你的例子,('a 1)返回nil是因为(get 1 'a)返回nil,而('a 1 2)返回提供的默认值2。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接