在clojure中,符号的功能是什么?为什么('+ 2 2)= 2?

时间:2013-10-16 15:50:41

标签: clojure

玩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的某个函数,它接受两个参数并返回第二个参数。我猜它与符号类的实现有关?

1 个答案:

答案 0 :(得分: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 

并返回第三个参数,如果没有传递第三个参数,则返回nil。