我经常编写: (some #(when (pred %) %) ...)
并且经常错误地将: (some #(pred %) ...)
写成这样。我认为让 (some #(when (pred %) %) ...)
成为一个 Clojure.core 中的内置函数会有价值。
建议的名称: first-by
。您也可以自由提出其他名称,我会在这里列出。
(first-by #(= (:id %) 2) [{:id 1} {:id 2} {:id 3}]) ;;=> {:id 2}
统计数据,我在本地的 .m2 目录中发现了 198 个 (some #(when ...) ..)
形式,以及 1503 个不是 when 的 (some #(foo ...) ...)
形式。
总的 some + fn 使用次数:1701,其中 11% 是 some + when 形式。
发现这些用法的程序
(ns grasp
(:require
[clojure.spec.alpha :as s]
[grasp.api :as g]))
(s/def ::some+when
(s/cat :some #{'some}
:fn (s/spec (s/cat :fn #{'fn 'fn*}
:args vector?
:when (s/spec (s/cat :when #{'when} :whatever (s/* any?)))))
:coll any?))
(defn keep-fn [{:keys [spec expr uri]}]
(let [conformed (s/conform spec expr)]
(when-not (s/invalid? conformed)
{:expr expr
:uri uri})))
(defn -main [& args]
(let [classpath (first args)
matches (g/grasp classpath ::some+when {:keep-fn keep-fn})]
(prn (count matches))))
{:deps {io.github.borkdude/grasp {:mvn/version "0.0.3"}}}
在 grep.app 上,我发现大约 8% 的 some 用法是 some+when 形式。