2010-09-21 56 views
7

是否可以在Clojure中編寫一個生成多個值或表達式的宏? 對我來說,看起來這是不可能的,至少不使用語法引用模板`(..)。如何編寫Clojure宏來創建多個表達式?

例如從:經由[1 (mr 2 3) 4][1 4][1 2 3 4]

或從:

(do 
    (prn 1) 
    (prn 4)) 

經由:

(do 
    (prn 1) 
    (mr 2 3) 
    (prn 4)) 

到:

(do 
    (prn 1) 
    (prn 2) 
    (prn 3) 
    (prn 4)) 

回答

10

甲宏擴展一種形式到另一種形式,所以你不能有一個宏返回兩個完全獨立的f奧姆斯。然而,你可以讓它返回複雜的形式,如do陳述,做一堆事情。

(defmacro foo [n] 
    `(do [email protected](map #(list println %) n))) 

對於你上面的例子,你可以把宏觀周圍的形式要修改:

(expand-mr 
(do 
    (prn 1) 
    (mr 2 3) 
    (prn 4))) 

宏的設計是安全的,因此他們不能對自己以外的任何修改範圍。目前,一個宏得到一個s表達式,並將其變成另一個更有用或有用的s表達式。爲了讓宏返回兩個單獨的s表達式,它將不得不修改它的包含表達式。語法必須有根本的不同,我不清楚s表達式是如何實現的。解決方案是擴大宏的範圍以包含需要修改的所有內容。

+0

謝謝亞瑟!我已經在期待這個答案,但很確定。 – Stefan 2010-09-21 18:55:44

+0

但是你真的可以給我一個例子:返回兩個獨立窗體的宏如何導致安全問題,但是否安全?我認爲範圍仍然是一樣的。 – Stefan 2010-09-21 22:07:15

+0

我對此使用的術語'安全'寬鬆地抱歉。我會編輯以擴展。 – 2010-09-21 22:47:42

相關問題