2011-07-02 57 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」])''。所以如果沒有,也許你可以稍微澄清一點。 – 2011-07-02 14:59:06

+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 
相關問題