2012-01-12 5 views
3

Clojure 매크로 여기에 noob. 일부 선택적 매개 변수가있는 함수가 있습니다. 이주는옵션 매크로 args를 함수에 전달하는 방법

(defn mk-foo [name & opt] 
    (vec (list* name opt))) 

: 나도 같은 선택적 인수를 받아 mk-foo의 호출에 투명하게 전달합니다 매크로를 작성하려고 해요

user> (mk-foo "bar" 1 2 3) 
["bar" 1 2 3] 

. 지금까지이있다 :

원하는 효과가
(defmacro deffoo [name & opt] 
    `(def ~name ~(apply mk-foo (str name) opt))) 

:

user> (macroexpand '(deffoo bar 1 2 3)) 
(def bar ["bar" 1 2 3]) 

apply의 사용은 opt이 서투른 느낌 목록을 평평하게 할 수 있습니다. 이 일을하는 관용적 인 방법이 있습니까? 나는 [email protected]이 필요하다고 생각하지만, 나는 바로 인용 할 수는 없다. 많은 감사합니다.

+1

나는 clojure에별로 좋지는 않지만 내게는 좋아 보인다! –

답변

3

귀하의 직감 적용을 사용하면이 경우에 도움이됩니다. 인용 형식을 사용하고 '모두 인용 부호가 없으면 unquote를 가장 작은 부분이나 목록으로 옮기는 것에 대해 생각하는 것을 도울 수 있습니다. 이렇게하면 간단하게 작성 될 수있는 양식을 생성하기 위해 코드를 사용하지 않아도됩니다.

user=> (defmacro deffoo [name & opt] `(def ~name [~(str name) [email protected]]))  
#'user/deffoo 
user=> (macroexpand '(deffoo "bar" 1 2 3))        
(def "bar" ["bar" 1 2 3]) 

여기가 foo는-MK하기 위해 호출입니다 :에 대한 호출을 우리가 ~ 한 수준에서 이동이 두 번째 경우에

(defmacro deffoo [name & opt] `(def ~name (mk-foo ~(str name) [email protected])))  
#'user/deffoo 
user=> (macroexpand '(deffoo "bar" 1 2 3))         
(def "bar" (user/mk-foo "bar" 1 2 3)) 

및하자 MK-foo는 인용과 인용을 끝내만을 유지 매개 변수 목록을 작성하는 데 필요한 args (의심 스러울 때 splicing-unquote 사용)

+0

빠른 답변 주셔서 감사합니다. 불행히도 제 실제의'mk-foo'는 게시 된 그림보다 상당히 복잡합니다. 직접 인라인으로 확장하는 것은 옵션이 아닙니다. 나는 그 전화를해야만한다. – fizzer

+0

은 이전 편집 중 하나에서 mk-foo를 사용하여 예제를 되살려 냈습니다. –

+0

이 작업은 +1하지만 실행 시간을'mk-foo'에 대한 호출을 연기하는 대신에 발생합니다. – fizzer

관련 문제