0
爲什麼我們可以寫高階函數和短形式
(defn factory-foo [] (fn [] (println "foo")))
(apply (factory-foo) [])
但不是:
(defn factory-bar [] #((println "bar")))
(apply (factory-bar) []) ;throws NPE
這是一個錯誤?
爲什麼我們可以寫高階函數和短形式
(defn factory-foo [] (fn [] (println "foo")))
(apply (factory-foo) [])
但不是:
(defn factory-bar [] #((println "bar")))
(apply (factory-bar) []) ;throws NPE
這是一個錯誤?
#((println "bar))
由讀者翻譯爲(fn [] ((println "bar")))
- 請注意額外的括號。 (println "bar")
這裏打印bar
並返回nil
,然後nil
本身被稱爲函數,因爲外部括號。實際上,nil
實際上是null
,並且試圖對其進行解引用導致NPE。
爲了避免這種情況,只需在#(..)
內刪除額外的一對括號:#(println "bar")
。
非常感謝。你說得很清楚。 – 2012-07-26 11:32:40
不客氣。 Just FYI [here](http://clojure.org/reader#The%20Reader--Macro%20characters),你可以在一般的Clojure閱讀器宏和'#(..)'形式中找到大量關於Clojure閱讀器宏的文檔。 – 2012-07-26 12:11:15