Macros 在使用宏';生成的类定义中动态绑定变量;s

Macros 在使用宏';生成的类定义中动态绑定变量;s,macros,scheme,racket,Macros,Scheme,Racket,情况就是这样:我有一个类定义,它的公共方法是使用宏定义的。方法如下所示: <-- macro definition surrounds this method --> (define/public (message-identifier parameters state-values) message-body ...) ... 我想知道在类方法的定义中,在这种情况下,return语句何时包含在方法体中。例如,我可以动态绑定一个变量吗?这个例子不起作用,但它带来了一个想法

情况就是这样:我有一个类定义,它的公共方法是使用宏定义的。方法如下所示:

<-- macro definition surrounds this method -->
(define/public (message-identifier parameters state-values)
    message-body ...) ...
我想知道在类方法的定义中,在这种情况下,
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语句使用单独的宏吗


谢谢

有几种方法可以实现这一点,但有一种方法是使用

您可以在宏定义可以看到的地方为返回包含定义一个参数:

(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!")))
如果您在
消息标识符
方法的正文中查阅
包含的返回值
,则该选项将起作用(由于
参数化
,该值将在正文外重置)。由于
参数化
,返回信息将被设置为每个方法的本地信息,并且不会干扰其他方法


你也可以用这个来解决这个问题,但这更复杂。除非这里关注性能,否则参数更简单

(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!")))