当用作函数时,Clojure符号会做什么?

时间:2012-09-05 12:39:01

标签: clojure

在尝试解决涉及重新实施评估的4Clojure问题“Universal Computation Engine”时,我不小心结束了这样的事情:

(apply '/ '(16 8))

而非预期:

(apply / '(16 8))

这引起了回归8的令人困惑的副作用,这让我觉得我搞砸了我的数学。

我稍后在一些调试后意识到我的错误 - 我在尝试调用它之前未能评估/符号 - 因此意识到clojure.lang.Symbol必须实现clojure.lang.IFn。但是该实现做什么?我可以做的就是用一个参数返回nil,或者给出第二个参数。

1 个答案:

答案 0 :(得分:12)

符号在地图中自我查找,就像关键字一样。见Symbol's implementation

…
122 public Object invoke(Object obj) {
123         return RT.get(obj, this);
124 }
125
126 public Object invoke(Object obj, Object notFound) {
127         return RT.get(obj, this, notFound);
128 }
…

RTclojure.lang.RT,几乎可以做任何事情。“RunTime”?)

在给出的示例中,查找失败(因为16不是映射),因此返回notFound值(8)。