這是爲什麼有效:Clojure的公案第8,#5
(= '(:anything :goes :here) (filter (fn [x] true) '(:anything :goes :here)))
,但不爲呢?
(= (:anything :goes :here) (filter (fn [x] true) '(:anything :goes :here)))
或
(= (:anything :goes :here) (filter (fn [x] true) (:anything :goes :here)))
甚至
(= '(:anything :goes :here) (filter (fn [x] true) (:anything :goes :here)))
有什麼特別的原因,第二對Arg的過濾器是帶引號的列表,而不是一個簡單的列表?
user=> (filter (fn [x] true) (:abc :def :ghi))
IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Keyword clojure.lang.RT.seqFrom (RT.java:505)
事實上,我仍然不確定列表是否也是一個函數調用。這與引用它似乎有關。除非列表爲空,否則需要引用所有「普通列表」嗎?
我想這很值得說幾乎每個Lisp都是如此,而不僅僅是clojure – jozefg 2013-04-06 10:17:55
你有點不對。 ':anything'是一個關鍵字,它被很好地定義爲一個函數。請參閱https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Keyword.java,'invoke(Object,Object)'方法。簡而言之,它詢問自己的第一個參數,如果第一個參數可以,並且它不能,它默認爲標準的'get'函數。在這兩種情況下,第二個參數都是默認值。所以下面的表達式:'(:abcd:defg:hijk)'將返回':hijk',作爲默認值。 – 2013-04-06 11:43:26
@VladimirMatveev感謝您的更正。我現在已經更新了答案。 – 2013-04-06 12:56:33