Something like this might be what you want: 

(letrec-syntaxes+values ([(absfn)
                          (syntax-rules ()
                            [(_ varname) (lambda (x) (+ (+ x localc) 
varname))])])
  ([(a) 2]
   [(b) 3]
   [(localc) 4]
   [(afn) (absfn a)]
   [(bfn) (absfn b)])
  (afn (bfn 3)))

BUT, I strongly recommend abstraction the macro over both variables. 


On Feb 1, 2012, at 11:45 AM, Rüdiger Asche wrote:

> Hi there,
> 
> I'm trying to get a grip on macros. Here is a very simple Racket expression  
> (1):
> 
> (letrec [(a 2)
>         (b 3)
>         (afn (lambda (x) (+ x a)))
>         (bfn (lambda (x) (+ x b)))]
>   (afn (bfn 2)))
> 
> Now I need a syntactic abstraction for afn and bfn. The following will do in 
> first approximation (2):
> 
> (define-syntax-rule (absfn varname) (lambda (x) (+ x varname)))
> 
> (letrec [(a 2)
>         (b 3)
>         (afn (absfn a))
>         (bfn (absfn b))]
>   (afn (bfn 2)))
> 
> 
> However, it will fail due to scoping rules in the following example (3):
> 
> (define-syntax-rule (absfn varname) (lambda (x) (+ (+ x localc) varname)))
> 
> (letrec [(a 2)
>         (b 3)
>         (localc 4)
>         (afn (absfn a))
>         (bfn (absfn b))]
>   (afn (bfn 2)))
> 
> In other words, my syntactic extension absfn needs to be embedded in the 
> namespace of the sorrounding expression (or as a "dumb" macro which simply 
> does lexical replacement without considering scoping, but needless to say 
> such a macro would be unhygienic).
> I suspect that letrec-syntax was meant for that purpose, but I can't figure 
> out how the parameters to define-syntax-rule would translate to those of 
> letrec-syntax.
> 
> Does anyone have sample code for how to get (3) above to work?
> 
> Thanks!
> 
> 
> 
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users


____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to