clojureで次のようなことを行うためのよりクリーンな方法はありますか?
(defn this [x] (* 2 x))
(defn that [x] (inc x))
(defn the-other [x] (-> x this that))
(defn make-vector [thing]
(let [base (vector (this (:a thing))
(that (:b thing)))]
(if-let [optional (:c thing)]
(conj base (the-other optional))
base)))
(make-vector {:a 1, :b 2}) ;=> [2 3]
(make-vector {:a 1, :b 2, :c 3}) ;=> [2 3 7]
「よりクリーンな」とは、これに近いものを意味します。
(defn non-working-make-vector [thing]
(vector (this (:a thing))
(that (:b thing))
(if (:c thing) (the-other (:c thing)))))
(non-working-make-vector {:a 1, :b 2} ;=> [2 3 nil] no nil, please!
(non-working-make-vector {:a 1, :b 2, :c 3} ;=> [2 3 7]
の任意のキーで任意の関数(たとえば、、)をthis
呼び出して、返されたベクトルに結果を配置したい場合があることに注意してください。重要なことは、キーがマップに存在しない場合は、ベクトルにを入れてはならないということです。that
the-other
thing
nil
これはこの質問に似ていますが、出力はマップではなくベクトルであるため、を使用できませんmerge
。