나는 1.7.0과 1.8.0 모두에서 이것을 시도했으며 Clojure는 :keys
키가 완전한 키를 사용하여 맵을 분해하지 않는 것으로 보입니다 . 함수 인수 위치를 바꿀 때도 작동하지 않기 때문에 인수의 꼬리에있는 것과 관련이 없다고 생각합니다.
(ns foo.sandbox)
(def foo ::foo)
(def bar ::bar)
(defn normalize-vals
[mmap & [{:keys [foo bar] :as ops}]]
(println "normalize-vals " ops " and foo " foo " bar" bar))
(normalize-vals {} {foo 1 bar 2})
=> normalize-vals {:foo.sandbox/foo 1, :foo.sandbox/bar 2} and foo nil bar nil
하나; 이것은 작동합니다 :
(defn normalize-vals
[mmap & [{a foo b bar :as ops}]]
(println "normalize-vals " ops " and foo " a " bar" b))
(normalize-vals {} {foo 1 bar 2})
=> normalize-vals {:cmt.sandbox/foo 1, :cmt.sandbox/bar 2} and foo 1 bar 2
이것이 결함입니까?
정규화되지 않은 키워드를 사용하여 구조를 해제하므로 다음 대신 :
[mmap & [{:keys [foo bar] :as ops}]]
당신은 사용해야합니다
[mmap & [{:keys [::foo ::bar] :as ops}]]
다음 clojure.walk/macroexpand-all
을 확장 하는 데 사용할 수 있습니다 normalize-vals
.
(clojure.walk/macroexpand-all '(defn normalize-vals
[mmap & [{:keys [foo bar] :as ops}]]
(println "normalize-vals " ops " and foo " foo " bar" bar)))
=> (def normalize-vals (fn* ([mmap & p__26720] (let* [vec__26721 p__26720 map__26722 (clojure.core/nth vec__26721 0 nil) map__26722 (if (clojure.core/seq? map__26722) (. clojure.lang.PersistentHashMap create (clojure.core/seq map__26722)) map__26722) ops map__26722 foo (clojure.core/get map__26722 :foo) bar (clojure.core/get map__26722 :bar)] (println "normalize-vals " ops " and foo " foo " bar" bar)))))
주목할 확장의 중요한 부분은 다음과 같습니다.
foo (clojure.core/get map__26722 :foo)
bar (clojure.core/get map__26722 :bar)
따라서 맵 디스트 럭처링의 키는 컴파일 타임 에 키워드로 변환되고 네임 스페이스의 foo 및 bar var의 값은 사용되지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다