SQLは、coalesce(a, b, c, ...)
すべての引数がnullの場合はnullを返すという関数を提供します。それ以外の場合は、最初のnull以外の引数を返します。
Clojureでこのようなものをどのように書きますか?
これは次のように呼び出されます。(coalesce f1 f2 f3 ...)
ここで、は必要な場合にのみ評価する必要fi
があるフォームです。がnil以外の場合は、評価しないでください。副作用が発生する可能性があります。f1
f2
たぶん、Clojureはすでにそのような関数(またはマクロ)を提供しています。
編集:ここで私が思いついた解決策(StuartHallowayのプログラミングClojure、(and ...)
206ページのマクロから変更):
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if c# c# (coalesce ~@rest)))))
動作しているようです。
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if (not (nil? c#)) c# (coalesce ~@rest)))))
修理済み。