2011-07-02 5 views
0

Clojure에서 컴파일 할 때 서로 정보를 공유하는 매크로 집합을 만드는 가장 좋은 방법은 무엇입니까?매크로 간 상태 전달

매크로를 사용하여 이전 매크로가 수행 한 작업을 파악하고 그에 따라 작동하는 방법을 찾고 있습니다. 다음처럼 사용할 수있는 매크로 구현하는 것이 방법 :이 매크로를 컴파일시에 일어날 필요가

(macro-block-with-data ["A" "B" "C"] 
    (process-next-data-item) ; macro expands using "A" 
    (process-next-data-item) ; macro expands using "B" 
    (process-next-data-item)) ; macro expands using "C" 

따라 정정

  • 을 런타임에 정기적으로 기능하지 즉
+0

(defn test [] (macro-block-with-data ["A" "B" "C"] (println "start") (process-next-data-item) ; macro expands using "A" (println "middle") (process-next-data-item) ; macro expands using "B" (println "almost done") (macro-block-with-data [ "NestedA" "NestedB" ] (println "starting nested") (process-next-data-item) (process-next-data-item) (println "done nested")) (process-next-data-item) (println "done"))) 

... 결과 아마 충분히 질문을 이해하지 않습니다. 읽었을 때'process-next-data-item [ "A" "B" "C"]) 맵핑을하고 싶습니다. 그래서 그렇지 않다면, 아마도 이것을 조금 분명히 할 수있을 것입니다. –

+0

@kwbeam - 컴파일 타임에해야하기 때문에 b) 코드에 맞지 않습니다. b) 일반적으로 코드는 각 프로세스 사이에 다른 코드가 많이있을 수 있으므로 간단한 맵 작업이 아닙니다. 데이터 항목 호출 및 c) 데이터는 단순한 시퀀스가 ​​아닌 임의의 것 (예 : 매크로가 확장 된 카운터) 일 수 있습니다. – mikera

답변

3

렉시 컬 범위가 맞습니까? 그렇다면 stateful 반복자를 사용하는 다음과 같은 작업을 수행 할 수 있습니다 (추한 일이지만). 예를 들어

(defmacro process-next-data-item [] 
    `(println "step" (.next ~'__state))) 

(defmacro macro-block-with-data [dat & body] 
    `(do 
    (let [~'__state (.iterator ~dat)] 
     [email protected]))) 

:에 ...

user> (test) 
start 
step A 
middle 
step B 
almost done 
starting nested 
step NestedA 
step NestedB 
done nested 
step C 
done 
nil