12

在尝试解决涉及重新实现评估的 4Clojure 问题“通用计算引擎”时,我不小心最终调用了这样的东西:

(apply '/ '(16 8))

而不是预期的:

(apply / '(16 8))

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

后来我在一些调试后意识到了我的错误——/在尝试调用它之前我没有评估这个符号——所以我意识到clojure.lang.Symbol必须实现clojure.lang.IFn. 但是那个实现有什么作用?我所能做的就是返回nil一个参数,或者如果给出第二个参数。

4

1 回答 1

13

符号在地图中查找自己,就像关键字一样。参见Symbol 的实现

…
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,它几乎可以做所有事情。“运行时”?)

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

于 2012-09-05T12:39:00.507 回答