Этот код сломан довольно тонким способом.
Для начала,
(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))
Из любопытства: откуда этот код?