私は、clojure ハッシュマップの値が相互に参照するための何らかの方法を考え出そうとしています。概念的には、次のようなものです。
(def m {:a 1 :b 5 :c (+ (:a m) (:b m))} ;Implies (= (:c m) 6)
もちろん、私は循環参照しているので、これは機能しませんm
。私は次のようなことができます
(def m {:a 1 :b 5 :c (fn [a b] (+ a b))})
((:c m) (:a m) (:b m)) ;=> 6
しかし、それは実際には何も得られません。なぜなら、どちらをa
関数b
に入れるかをまだ知る必要があるからです。別の試み:
(def m {:a 1 :b 5 :c (fn [m] (+ (:a m) (:b m)))})
((:c m) m) ;=> 6
特にこのマップではありませんが、関数をマップに内部化したので、少し良くなりました。私はこのようなものでそれを修正しようとするかもしれません
(defn new-get [k m]
(let [v-or-fn (get m k)]
(if (fn? v-or-fn) (v-or-fn m) v-or-fn)))
(def m {:a 1 :b 5 :c (fn [m] (+ (:a m) (:b m)))})
(new-get :a m) ;=> 1
(new-get :b m) ;=> 5
(new-get :c m) ;=> 6
これが私ができる最善のことだと思います。もっと賢いものを見逃していますか?