Почему существует только один метод в синтаксисе define-my-class? - PullRequest
0 голосов
/ 07 декабря 2018
(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 Ответ

0 голосов
/ 10 декабря 2018

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

...