(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>]
也是一种方法吗?它们的结构非常相似。
答案 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)))
(或类似的语法,因为method
,bigger-x
等将被绑定为变量),以使其与有效的语法匹配。