Почему этот макрос не может быть выполнен? - PullRequest
0 голосов
/ 10 апреля 2011

У меня следующий тупой тест:

(define-syntax a
 (lambda (stx)
   (syntax-case stx ()
     [(k e s) #'(let ((show display)) (e s))])))
(a show "something")

Почему это не работает?(Ошибка в DrRacket: expand: unbound identifier in module in: show.

. Однако может работать следующее:

(define-syntax a
 (lambda (stx)
   (syntax-case stx ()
     [(k e s) 
      (with-syntax ((show (datum->syntax #'k 'show)))
        #'(let ((show display)) (e s)))])))
(a show "something")

. ПОЧЕМУ?

1 Ответ

2 голосов
/ 10 апреля 2011

Хм, я полагаю, что вы пытаетесь это сделать после прочтения сообщения в блоге , о котором я упоминал в более раннем ответе - но этот блог объясняет именно эту проблему.В частности, ваш первый пример имеет два разных идентификатора show, один из которых связан с макросом, а другой отличается от , получаемого в результате использования верхнего уровня (и не связанного).OTOH, во втором случае вы создаете show с лексическим контекстом пользовательского кода.

...