0
(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. 我很困惑为什么第 4 行只有 1 种方法。quote <attr>表达式中的不[(equal? msg (quote <attr>)) <attr>]也是一种方法吗?它们的结构非常相似。

4

1 回答 1

0

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

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

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

于 2018-12-10T04:42:35.213 回答