2012-09-05 30 views
11

虽然试图解决4Clojure问题“Universal Computation Engine”涉及重新实现的评价,我不小心弄成调用是这样的:Clojure符号作为函数使用时会做什么?

(apply '/ '(16 8)) 

,而不是预期的:

(apply/'(16 8)) 

这不得不令人困惑的副作用返回8,这让我觉得我已经搞乱了我的数学。

我后来发现我的错误经过一些调试 - 我没有在尝试调用它之前评估/符号 - 并且因此认识到clojure.lang.Symbol必须实现clojure.lang.IFn。但是那个实现做了什么?我所能做到的只有一个参数返回nil,或者如果给出第二个参数。

+0

[将参数传递给Clojure符号时会发生什么?](http://stackoverflow.com/questions/8219305/what-happens-when-i-pass-arguments-to-a-clojure-符号) – amalloy

回答

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,它不只是一切“运行系统”)

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

相关问题