2015-11-19 35 views
1

這就是這樣的情況:我有一個類定義,它的公共方法是使用宏定義的。該方法看起來是這樣的:動態地綁定一個變量內部的宏定義的類定義

<-- macro definition surrounds this method --> 
(define/public (message-identifier parameters state-values) 
    message-body ...) ... 

其中所有的變量(message-identifierparametersstate-values)是宏展開的一部分。 message-body是一個像在常規方法體中所期望的一樣的表達式序列(由宏擴展生成)。例如,如果您希望顯式聲明返回值,則方法的主體可能包含一些可擴展的表單,表達式(return 1)可能是我們可以應用(例如)此規則的主體的一部分:

(define-syntax-rule (return value) 
    (displayln "i should return a value!")) 

我想在類方法的定義知道什麼時候,在這種情況下,return聲明包含在方法的主體。那麼我可以動態地綁定一個變量嗎?這個例子不起作用,但它帶來了這個想法。

(define/public (message-identifier parameters state-values) 
    (define return-included? #t) 
    message-body ...) ... 

(define-syntax-rule (return value) 
    (begin (set! return-included? value) ; 'return-included?' is undefined 
      (displayln "i should return a value!"))) 

或可能我也許做花哨的東西,在一個可擴展的方法體,而不必爲return語句一個單獨的宏宏宏?

謝謝

回答

2

有幾種方法可以做到這一點,但一個方法是使用parameters

可以定義一個參數返回納入地方在那裏你的宏定義可以看出來:

(define return-included? (make-parameter #f)) 

然後在你的代碼,你可以有

(define/public (message-identifier parameters state-values) 
    (parameterize ([return-included? #f]) 
    message-body ...)) 

(define-syntax-rule (return value) 
    (begin (return-included? value) 
     (displayln "i should return a value!"))) 

,如果你諮詢,將工作message-identifier方法的主體中的return-included?的值(由於parameterize,該值將在體外重置)。由於parameterize,返回信息將設置在每個方法的本地,並且不會干擾其他方法。


你或許可以也syntax parameters解決這個問題,但是這是更復雜。除非性能在這裏受到關注,否則參數更簡單。