我试图想出一些方法让 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
我认为这是我能做的最好的事情。我错过了更聪明的东西吗?