当作为函数使用时,Clojure符号有什么作用?

12

在尝试解决4Clojure问题 "通用计算引擎" 时,涉及重新实现评估的过程中,我意外地调用了类似于以下内容的东西:

(apply '/ '(16 8))

而不是预期的:

(apply / '(16 8))

这导致了令人困惑的副作用,返回8,让我以为我的数学有问题。

后来在调试时我意识到我的错误——我未能在尝试调用它之前评估/符号——因此意识到clojure.lang.Symbol必须实现clojure.lang.IFn。但是这个实现做了什么呢?我唯一能让它做的就是用一个参数返回nil,或者如果给出第二个参数则返回第二个参数。


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,它几乎做了所有事情。 "RunTime"?)

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


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