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