2013-10-16 43 views
4

使用Clojure周围玩,我注意到,('+ 2 2)没有把这样的错误我会一直期待 - 它返回2.我已经花了几分钟打转转:在clojure中,符号投射到什么功能?为什么('+ 2 2)= 2?

(def f (cast clojure.lang.IFn 'a-symbol)) 
(f 5)  ;; => nil 
(f 5 5) ;; => 5 
(f 5 5 5) ;; ArityException Wrong number of args (3) passed to: Symbol 
(f "hey")    ;; => nil 
(f "foo" "bar")  ;; => "bar" 
(f "foo" "bar" "baz") ;; => ArityException Wrong number of args (3) passed to: Symbol 

据我所知,符号被转换为名称为Symbol的函数,该函数接受两个参数并返回第二个参数。我猜它与符号类的实现有关?

+0

这是一个字典查找操作。例如'(:字典)'<=>'(得到字典:a)'。 – SaltyEgg

回答

10

当作为函数调用符号(如关键字)看着他们的第二个参数

user> (def my-map '{a 1 b 2 c 3}) 
#'user/my-map 
user> ('a my-map) 
1 
user> ('a my-map :not-found) 
1 
user> ('z my-map :not-found) 
:not-found 

,并返回第三个参数传递的地图自我了,如果它获得通过,以表示没事的时候被发现。在您的例子,当你查找的东西的象征,是不是地图,比如5号,它没有找到它:

user> ('z 4 :not-found) 
:not-found 
user> ('z 'z :not-found) 
:not-found 

,并返回第三个参数,或零,如果没有第三个参数是通过。

+0

非常酷,认为只是为关键字工作。谢谢! –