[racket] Macro Assistance

From: J. Ian Johnson (ianj at ccs.neu.edu)
Date: Tue Aug 27 09:47:47 EDT 2013

What you're trying to do is capture some amount of the invocation context of the macro, which is not what macros are meant for. You're better of making (bar e) a macro for (+ 3 e). Unfortunately bar is not part of the input, so you'll need to make it a syntax parameter, so it has well-behaved scope.

(require racket/stxparam)
(define-syntax-parameter bar (lambda (stx) (raise-syntax-error #f "Only for use in define-foo" stx)))
(define-syntax (define-foo stx) 
  (syntax-case stx () 
    [(_ (name . params) . body)
     #'(define (name . params)
          (syntax-parameterize ([bar (syntax-rules () [(_ e) (+ 3 e)])])
             . body))]))

Unless you have separate macro invocations setting up some compile-time context (see Macros That Work Together, and Keeping it Clean with Syntax Parameters) for later use, you should focus on making the macro's meaning only depend on its input.

----- Original Message -----
From: "Chad Albers" <calbers at neomantic.com>
To: users at racket-lang.org
Sent: Tuesday, August 27, 2013 4:33:17 AM GMT -05:00 US/Canada Eastern
Subject: [racket] Macro Assistance

I'm still trying to grok macros - which are amazing, but hard. I'd like to know if it is possible capture part of the following expression 

(display (+ 2 (bar (+ 1 2)))) 

if "bar" is a literal in the macro, I would like to capture body0 as (+ 1 2) and body1 as (display (+ 2 ...)). 

This is a totally artificial example. 

Here's what I have: 

(define-syntax (define-foo stx) 
(syntax-case stx (bar) 
([_ (name param) (body1 (bar . body0))] 
(syntax (define (name param) 
(body1 (+ 3 . body0))))))) 

(define-foo (foof env) 

(display (bar (+ 1 2)))) 

This works...and expands to. 

(define (foof env) 
(display (+ 3 (- 1 (+ 1 2))))) 

(Note that -1 has been substitute for the "bar" literal"). 

This expression fails with "bad syntax" 

(define-foo (foog env) 

(display (+3 (bar (- 1 (+ 1 2)))))) 

I don't seem be to able to capture (display (+3 )) as separate from (bar (-1 (+ 1 2))) 

Is this possible to capture? 

Thanks for any help and insights into macros 

  Racket Users list:

Posted on the users mailing list.