2013-10-16 44 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

非常酷,認爲只是爲關鍵字工作。謝謝! –