在 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
并将结果放入返回的向量中。重要的是,如果地图中不存在密钥,则不应将 anil
放入向量中。
这类似于这个问题,但输出是一个向量而不是一个地图,所以我不能使用merge
.