доступ к аргументам макросов Clojure - PullRequest
0 голосов
/ 15 января 2019

Мне было интересно, есть ли способ получить доступ к значению аргументов макроса первого потока в 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 ]

0 голосов
/ 16 января 2019

В дополнение к комментарию akond , обратите внимание, что использование as-> может быстро запутать. Я рекомендую либо извлечь функцию верхнего уровня для этих случаев, либо пытаться использовать as-> только ->:

(-> something
    (process-something)
    (as-> $ (do-something $ (very-complicated $)))
    (finish-processing))
0 голосов
/ 15 января 2019

Вы можете использовать as->:

(let [x {:a 1 :b 2}]
    (as-> x it
        (assoc it :a 20)                                             
        (assoc it :b (:a it)))) 
...