2012-07-26 56 views
0

爲什麼我們可以寫高階函數和短形式

(defn factory-foo [] (fn [] (println "foo"))) 
(apply (factory-foo) []) 

但不是:

(defn factory-bar [] #((println "bar"))) 
(apply (factory-bar) []) ;throws NPE 

這是一個錯誤?

回答

7

#((println "bar))由讀者翻譯爲(fn [] ((println "bar"))) - 請注意額外的括號。 (println "bar")這裏打印bar並返回nil,然後nil本身被稱爲函數,因爲外部括號。實際上,nil實際上是null,並且試圖對其進行解引用導致NPE。

爲了避免這種情況,只需在#(..)內刪除額外的一對括號:#(println "bar")

+0

非常感謝。你說得很清楚。 – 2012-07-26 11:32:40

+0

不客氣。 Just FYI [here](http://clojure.org/reader#The%20Reader--Macro%20characters),你可以在一般的Clojure閱讀器宏和'#(..)'形式中找到大量關於Clojure閱讀器宏的文檔。 – 2012-07-26 12:11:15