【问题标题】:Dynamically bind a variable inside a class definition built with macro's在使用宏构建的类定义中动态绑定变量
【发布时间】:2015-11-19 17:54:57
【问题描述】:

情况是这样的:我有一个类定义,它的公共方法是使用宏定义的。这些方法看起来像这样:

<-- 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 语句使用单独的宏?

谢谢

【问题讨论】:

    标签: macros scheme racket


    【解决方案1】:

    有几种方法可以做到这一点,但一种方法是使用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 解决这个问题,但这更复杂。除非这里关注性能,否则参数会更简单。

    【讨论】:

      猜你喜欢
      • 2015-12-24
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多