2014-01-16 31 views
0

我看到在Clojure wikibook如何將接受多個參數的函數轉換爲謂詞?

user=> (filter nil? [:a :b nil nil :a]) 
(nil nil) 

下面的代碼,我看到nil?是一個謂語。 但是,我當前想要將clojure.contrib.string/substring?轉換爲一個謂詞,這意味着,雖然substring是一個接受兩個參數的函數,但我想將第一個參數設置爲fixed。 我該怎麼做?

目前我正在寫這樣的事情

(filter (fn [x] (clojure.contrib.string/substring? "todo" x)) 
     ["todo" "todo" nil "todos"]) 

這樣做有沒有更好的辦法?

回答

7

你的代碼是正確的,除了

  • clojure.contrib.string已被吸收到clojure.stringsubstring?是沒有更多的。請參閱clojure.contrib migration

  • 您需要保護樣本數據中的nil

您還可以使用#()讀者宏,如果你喜歡,例如用正則表達式

(filter #(when % (re-find #"todo" %)) ["todo" "todo" nil "todos"]) 

或Java的互操作

(filter #(when % (.contains % "todo")) ["todo" "todo" nil "todos"]) 

兩個

;=> ("todo" "todo" "todos") 
相關問題