问题 Clojure符号在用作函数时会做什么?


在试图解决4Clojure问题时“通用计算引擎“涉及重新实施评估,我不小心结束了这样的事情:

(apply '/ '(16 8))

而不是预期的:

(apply / '(16 8))

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

我后来在一些调试后意识到我的错误 - 我没有评估 / 在尝试调用它之前的符号 - 并且意识到这一点 clojure.lang.Symbol 必须实施 clojure.lang.IFn。但是这个实现是什么呢? ?我能做的就是回归 nil 一个参数,或第二个参数,如果给出。


4554
2017-09-05 12:39


起源

可能重复 当我将参数传递给Clojure符号时会发生什么? - amalloy


答案:


符号 看看自己 在地图中,就像关键字一样。看到 符号的实现

…
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 }
…

RT 是 clojure.lang.RT,这几乎可以做到。 “运行”?)

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


12
2017-09-05 12:39