Почему в определении-синтаксиса my-class есть только один метод?

(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>] тоже метод? Их структуры очень похожи.

1 ответ

Разве не 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и т. д. будут связаны как переменные), чтобы он соответствовал допустимому синтаксису.

Другие вопросы по тегам