如何将接受多个参数的函数转换为谓词?

时间:2014-01-16 16:59:46

标签: clojure

我在Clojure wikibook

上看到以下代码
user=> (filter nil? [:a :b nil nil :a]) 
(nil nil)

我看到nil?是一个谓词。 但是,我目前想将clojure.contrib.string/substring?转换为谓词,这意味着,虽然substring是一个接受两个参数的函数,但我想将第一个设置为固定。 我怎么能这样做?

目前我正在写这样的东西

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

有更好的方法吗?

1 个答案:

答案 0 :(得分:7)

除了

,你的代码没问题
  • clojure.contrib.string已被clojure.string吸收,substring?已不复存在。请参阅clojure.contrib migration

  • 您需要保护示例数据中的nil

如果您愿意,也可以使用#()阅读器宏,例如使用正则表达式

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

或Java interop

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

两个

;=> ("todo" "todo" "todos")