为什么在定义语法my-class中只有一种方法?

时间:2018-12-07 08:48:30

标签: racket define-syntax

(define-syntax my-class
    (syntax-rules ()
        [(my-class <class-name> (<attr> ...) 
            (method (bigger-x other) (> x (other 'x))))
         (define (<class-name> <attr> ...)
           (lambda (msg)
             (cond [(equal? msg (quote <attr>)) <attr>] ... 
                   [(equal? msg 'bigger-x) (lambda (other) (> x (other 'x)))]
                   [else "Unrecognized message!"])))]))

这不是一个好的模板。但这对解释define-syntax的语法很有帮助。我很困惑为什么第四行只有一种方法。表达式quote <attr>中的[(equal? msg (quote <attr>)) <attr>]也是一种方法吗?它们的结构非常相似。

1 个答案:

答案 0 :(得分:0)

  

表达式quote <attr>中的[(equal? msg (quote <attr>)) <attr>]也不是一种方法吗?

假设您的意思是“函数”,然后是,但是它是一个将在运行时评估的函数。例如,my-class是一个将在编译时求值的函数,因为它是用define-syntax定义的。

似乎您正在使用my-class来扩展“方法” bigger-x的定义,该方法将某个值x与一个参数进行比较。在这种情况下,如果cond是标识符,(quote <attr>)将在运行时求值,<attr>将扩展为符号。没有一些上下文,很难知道x可能是什么(如果在运行时未找到变量x,则会引发异常),并且需要定义my-class的方式您必须始终传递(method (bigger-x other) (> x (other 'x)))(或类似的语法,因为methodbigger-x等将被绑定为变量),以使其与有效的语法匹配。