1

これとは反対のことを効果的に行うマクロを探していmaybe-mます。つまり、残りの式を評価せずに、非 nil を返す最初の式の結果が必要です。「ソリューション」が遅延シーケンスを使用する場合、それらはチャンクで評価されるため、この最後の部分は重要です...つまり、不要なときに式が評価される可能性があります。

これが私が探しているものの例です:

(defn really-cool-stuff [a b c]
  (first-not-nil
    (operation1 a b) ; <-- this returns nil,
    (operation2 b c) ; <-- this returns non-nil, the result is returned
    (operation3 a b c))) ; <-- this is not evaluated
4

1 に答える 1

8

nil偽物なので、orあなたが探していることをします。

(defn really-cool-stuff [a b c]
  (or
    (operation1 a b)
    (operation2 b c)
    (operation3 a b c)))

唯一の例外は、関数が を返す可能性がある場合ですfalse。その場合、orより厳密な条件を除いて、を模倣するマクロを作成できます。

(defmacro or-nil?
  ([] nil)
  ([x] x)
  ([x & next] `(let [or# ~x] (if (nil? or#) (or-nil? ~@next) or#))))
于 2013-10-13T03:57:59.260 に答える