[racket] How does free-identifier=? and bound-identifier=? works?
Veer wrote:
> I am unable to understand how free-identifier=? and
> bound-identifier=? works?
[...]
> When I use them ,they both produces #t .
You are misunderstanding the meaning of the function names;
you may try to read [1] which is an annotated section from
the R6RS standard.
However, your true misunderstanding is to think that
identifiers in the input form of a macro transformer have a
"meaning", for example LET is a binding syntax; they have
not: identifiers in an input form are just identifiers, they
do not affect the binding of other identifiers. In your
example:
(check (lambda (x y) (let ([x 2]) x)))
the identifiers LAMBDA and LET in the input form of the use
of CHECK are "just identifiers", they do not influence X in
any way; only if you put into the output form of CHECK they
may behave like the syntaxes of the language (if they are
in the correct position).
Also notice that your CHECK macro (as I understand it)
does not do what you want to do; to do what you want to do
you should (notice the use of #` and #,):
#!r6rs
(import (rnrs))
(define-syntax check
(lambda (stx)
(syntax-case stx (lambda let)
[(_ (lambda (x y ...) (let ([a b]) c)))
#`(values #,(free-identifier=? #'x #'c)
#,(bound-identifier=? #'x #'c))])))
(let-values (((r1 r2)
(check (lambda (x y) (let ([x 2]) x)))))
(write (list r1 r2))
(newline))
HTH
[1] <http://marcomaggi.github.com/docs/nausicaa.html/stdlib-syntax_002dcase-identifier.html>
P.S. It takes time understand this stuff; also, some people
think that FREE-IDENTIFIER=? and BOUND-IDENTIFIER=? are an
unfortunate choice of names, which induces misunderstanding.
--
Marco Maggi