Hi all, hi Matthias, I would like to come back to my (still unsolved) problem I proposed some days ago:
when using define-syntax in a inner scope of bindings (like let), in this example: (define-syntax mymacro (syntax-rules () [(_ x) (eval `(lambda (w) (print (quote x)) (if x w #f)))])) (let* ((s 3) (f (mymacro (> s 0)))) (f 5)) reference to undefined identifier: s of course if you: (define s 3) in the top environment, the error will not appear. This is even more clear if you expand the macro: (syntax->datum (expand '(mymacro (> s 0)))) ... you see that "s" is a %top binding. I know that if I make the macro to return directly the lambda, it works. Nevertheless, in my implementation, I still need to use the "(eval (quasiquote (lambda ...)))". Why? my macro is like a compiler that generates a lambda code very huge: the code is recursive in some of its part, but, for efficiency reasons, i preferred to inline all recursive calls. So I use a function "expander" that makes recursive inlining (or injecting) of code). It is more or less something like: `(lambda (...) ... static-code... ,(expander ...) ...) where "expander call itself with different parameters. This is just to know your opinion... if the "(eval (quasiquote (lambda ...)))" cannot see local bindings like in let*, than I have to choice: 1) renounce to the feature. 2) looking for alternative methods to generate my code with recursive inlining Than you, Cheers, Maurizio.
_________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users