访问Clojure的线程优先宏参数

7
我想知道在Clojure中,是否有一种方法可以在执行线程优先宏时访问其参数值。例如:
(def x {:a 1 :b 2})
(-> x
    (assoc :a 20) ;; I want the value of x after this step
    (assoc :b (:a x))) ;; {:a 20, :b 1}

我注意到这个可以工作:

(-> x 
    (assoc :a 20) 
    ((fn [x] (assoc x :b (:a x))))) ;; {:a 20, :b 20}

但是还有其他方法吗?

2个回答

10
你可以使用as->
(let [x {:a 1 :b 2}]
    (as-> x it
        (assoc it :a 20)                                             
        (assoc it :b (:a it)))) 

1
除了 akond的评论之外,需要注意使用as->可能会很快变得混乱。我建议在这些情况下提取一个顶级函数,或者尝试仅在->中使用as->
(-> something
    (process-something)
    (as-> $ (do-something $ (very-complicated $)))
    (finish-processing))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接