Какое использование синтаксиса-кейса в этой форме в Racket / Scheme - PullRequest
0 голосов
/ 08 марта 2011

Меня смущает документация о синтаксисе использования, но что может означать f?

(define-syntax (check stx)
   (syntax-case stx ()
       [(f (x y))
        #'(list 'second: f x y)]))

1 Ответ

1 голос
/ 08 марта 2011

Этот код сломан довольно тонким способом.

Для начала,

(define-syntax (check stx)
   (syntax-case stx ()
       [(f (x y))
        #'(list 'second: f x y)]))

(check (3 4))

выдает ошибку: check: неверный синтаксис в: check

Проблема, однако, заключается в использовании из 'f', которое появляется в расширении. Чтобы увидеть это, попробуйте вынуть это:

(define-syntax (check stx)
   (syntax-case stx ()
       [(f (x y))
        #'(list 'second: 1234 x y)]))

(check (3 4))

Это оценивает отлично, производя '(второй: 1234 3 4)

Итак, почему первый отказывает? Проблема в том, что в вашем первом примере,

(check (3 4))

расширяется до

(list 'second check 3 4)

Проблема с этим, однако, заключается в том, что «проверка» в расширении является еще одним использованием макроса «проверка», и поэтому должна быть расширена на далее , и это второе расширение не имеет правильной формы.

Чтобы увидеть это, вы можете попробовать расширить вашу программу с помощью макропереступника. Запустите шаговый макрос, используйте раскрывающееся меню, чтобы выбрать «Стандартное» скрытие макроса, нажмите кнопку «Конец ->» и вернитесь на один шаг назад.

Обычное соглашение заключается в использовании символа подчеркивания "_" в качестве символа "все равно" для сопоставления с именем макроса в шаблоне, например так:

(define-syntax (check stx)
   (syntax-case stx ()
       [(_ (x y))
        #'(list 'second: 1234 x y)]))

(check (3 4))

Из любопытства: откуда этот код?

...