разница между бесплатным идентификатором =? и связанный идентификатор =?

Пытаетесь понять free-identifier=? и связанный идентификатор =?. Может ли кто-нибудь дать мне эквивалентные примеры кода, где используется free-identifier=? вернет true и с помощью bound-identifier=? вернет ложь.

Спасибо


person jahhaj    schedule 23.07.2011    source источник
comment
comment
См. это письмо в списке рассылки Racket, а также окружающая нить.   -  person Eli Barzilay    schedule 25.07.2011
comment
Я понимаю, для чего эти функции должны использоваться, и я понимаю, почему они определены именно так (с точки зрения меток и подстановок). Что мне трудно понять, так это обстоятельства, при которых они могут давать разные результаты. В этом поможет пример кода (даже если он довольно бессмысленный).   -  person jahhaj    schedule 26.07.2011
comment
Лучше всего спросить в списке ракеток. Тогда, вероятно, ответит Райан. (Он тоже на SO, но, скорее всего, пропустит это здесь, я на всякий случай пропингую его.)   -  person Eli Barzilay    schedule 27.07.2011


Ответы (1)


Вот пример:

(define-syntax (compare-with-x stx)
  (syntax-case stx ()
    [(_ x-in)
     (with-syntax ([free=? (free-identifier=? #'x-in #'x)]
                   [bound=? (bound-identifier=? #'x-in #'x)])
       #'(list free=? bound=?))]))

(define-syntax go
  (syntax-rules ()
    [(go) (compare-with-x x)]))

(go) ;; => '(#t #f)

x, представленный go, имеет метку этого шага расширения, а x в compare-with-x — нет, поэтому bound-identifier=? считает их разными.

Вот еще один пример:

(define-syntax (compare-xs stx)
  (syntax-case stx ()
    [(_ x1 x2)
     (with-syntax ([free=? (free-identifier=? #'x1 #'x2)]
                   [bound=? (bound-identifier=? #'x1 #'x2)])
       #'(list free=? bound=?))]))

(define-syntax go2
  (syntax-rules ()
    [(go2 x-in) (compare-xs x-in x)]))

(go2 x) ;; => '(#t #f)

Здесь go2 также вводит x с отметкой, тогда как x, данное go2 в качестве аргумента, не имеет отметки. Та же история.

person Ryan Culpepper    schedule 27.07.2011
comment
Обратите внимание, что (compare-with-x x) также имеет результат '(#t #f) . Таким образом, макрос go не нужен для первого примера. - person soegaard; 18.06.2014