2017-11-26 31 views

답변

2

당신의 data VAR이 매크로 호출하기 전에 네임 스페이스에 정의되어있는 경우, 당신이 그것을 해결하기 위해 기능을 조작하는 몇 가지 네임 스페이스를 사용할 수있는 이름으로 값이다 :

(defmacro pair-defs [data] 
    `(do [email protected](for [[k v] @(ns-resolve *ns* data)] 
      `(def ~k ~v)))) 

user> (def data [['a 10] ['b 20]]) 
#'user/data 

user> (pair-defs data) 
#'user/b 

나에 의해 문자 데이터와 데이터를 모두 처리 할 수 VAR 이름 : 호출이 원하는 형태로 확장

(defmacro pair-defs [data] 
    (let [dt (if (symbol? data) @(ns-resolve *ns* data) data)] 
    `(do [email protected](for [[k v] dt] 
      `(def ~k ~v))))) 

: (do (def a 10) (def b 20))

따라서 eval과 같은 더러운 트릭없이 네임 스페이스 val을 해결하는 것은 완전히 가능하지만 매크로의 불필요한 사용법입니다. 예를 들어 작업은 일반 함수 호출로 쉽게 대체 할 수 있습니다.

(defn pair-defs1 [data] 
    (doseq [[k v] data] 
    (intern *ns* k v))) 
은 어떤 data 순서 작업은 로컬 또는 글로벌, 문자 또는

생성 될