2010-01-12 55 views
1

我想編寫一個助手宏來編寫匹配擴展。我有這樣的事情:如何將「休息」變量綁定到宏中的值列表中

​​

所以我想要一個宏,將這樣做讓綁定。我已經開始像這樣的東西:

(define-syntax-rule (define-my-expander (id vars ...) body) 
    (define-match-expander id 
    (λ (stx) 
     (match-let ([(vars ...) (cdr (syntax-e stx))]) 
     body)))) 

match-let在改造時沒有定義。

第一個問題是有沒有其他的方式來做到這一點(我的意思是使這個擴展器)?也許在我沒有意識到的plt-scheme中有類似的東西,或者我在某種程度上做錯了。

無論對第一個問題的回答如果我想要將變量列表綁定到宏內部的值列表中,我該怎麼做?

編輯:在與禮的答案宏觀組合現在看起來是這樣的:

(define-syntax-rule (define-my-expander (id vars ...) body) 
    (define-match-expander id 
    (λ (stx) 
     (syntax-case stx() 
     [(_ vars ...) 
     body])))) 

回答

4

我不知道它是什麼,你想實現的,但我的猜測是,這正好在右方向:

(define-match-expander my-expander 
    (lambda (stx) 
    (syntax-case stx() 
     [(_ (var1 var2) stuff ...) 
     ;; use #'var1 #'var2 and #'(stuff ...) here 
     ]))) 

的事情是,syntax-e是用來「解包」一個語法對象,並給你它擁有 - 但實際的內容可能會讓你大吃一驚。例如,(foo . (bar))(foo bar)的內容略有不同。所以一般來說,使用syntax-case爲你做模式匹配是多了比較容易。除了更容易,它還會在出現錯誤時給出一些明智的錯誤消息,而不是代碼中的內容。

+0

謝謝,這是有益的,並幫助我解決了我的問題。爲了完整起見,如果我沒有創建擴展器,但是說,擴展爲具有使用列表的lambda的宏,並且想要將列表元素綁定到宏參數? – Slartibartfast 2010-01-13 08:28:20

+0

大多數情況下,當您使用模式匹配工具編寫宏時。但是每隔一段時間(當您編寫更高級的宏時會出現更多錯誤消息等問題),您需要將它們變成列表。爲此,你可以使用類似'(syntax-> list#'(stuff ...))' - 它將帶括號的語法對象,並將其轉換爲語法對象列表。 – 2010-01-13 08:40:25

相關問題