[racket] rudimentary macro Q.

From: David Vanderson (david.vanderson at gmail.com)
Date: Wed Feb 26 15:18:34 EST 2014

On 02/26/2014 01:54 PM, Matthew Butterick wrote:
> Thank you. Maybe I can make the question a tiny bit less dumb (though still really dumb).
> In this example, when I use the syntax macro 'public-proc', it keeps the 'private-proc' binding from the 'inner' submodule.
> Q: How could I invoke 'public-proc' for its syntax-generating effect in the main module, yet have it adopt the binding of 'private-proc' in the main module?
> I gather roughly that it requires tampering with the lexical information of the syntax objects. Then things get hazy.
I think you are looking for define-macro, so that you can defeat 
hygiene.  Of course this comes with all of the normal caveats about the 
dangers of breaking hygiene, so if this is what you're looking for, can 
you describe why you want to do it?


#lang racket

(module inner racket
   (provide public-proc public-proc2)
   (require compatibility/defmacro)
   (define-syntax-rule (public-proc x) (private-proc x))
   (define (private-proc x) (format "Inner private proc says ~a" x))
   (define-macro (public-proc2 x) `(private-proc ,x)))

(require 'inner)

(define (private-proc x) (format "Outer private proc says ~a" x))

(syntax->datum (expand #'(public-proc 'hi)))
;> '(#%app private-proc 'hi)
(public-proc 'hi)
;> "Inner private proc says hi"

(public-proc2 'hi)
;> "Outer private proc says hi"

(syntax->datum (expand #'(private-proc 'hi)))
;> '(#%app private-proc 'hi)
(private-proc 'hi)
;> "Outer private proc says hi"


Posted on the users mailing list.