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