2011-07-02 9 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

​​

...結果私はおそらく十分に質問を理解していません。読んでみると、あなたが望むように思えます。(map process-next-data-item ["A" "B" "C"]) 'そうでなければ、多分あなたはこれを少しはっきりさせることができます。 –

+0

@kwbeam - a)コンパイル時にする必要があり、b)一般的にコードは単純なマップ操作ではないため、各プロセス間に他のコードがたくさんある可能性があるため、データ項目呼び出し、およびc)単なるシーケンスではなく、データが何か(例えばマクロが展開された回数など)である可能性があります。 – mikera

答えて

3

レキシカルスコープですか?そうであれば、ステートフルなイテレータを使用する次のようなことができます(ただし、醜いです)。一例として、

(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 
関連する問題