[plt-scheme] Inlined language from a language module

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Fri Mar 20 13:21:07 EDT 2009

At Fri, 20 Mar 2009 11:02:35 -0600, Jay McCarthy wrote:
> On Fri, Mar 20, 2009 at 10:54 AM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
> > (define-syntax (with-mini stx)
> >  (syntax-case stx ()
> >    [(_ expr)
> >     #`(begin
> >         (require "mini.ss")
> >         #,(strip-context #'expr))]))
> 
> Am I right to assume this only works at the top-level because it
> relies on require?

Good point.

The simplest way I can find to allow `with-mini' anywhere requires

 1. An extra module.

 2. A `replace-context' function instead of `strip-context'.

The latter is a simple generalization of `strip-context', and I've
added it to `syntax/strip-context' in SVN.

---- with-mini.ss ----------------------------------------
#lang s-exp "with-mini-maker.ss"
"mini.ss"

---- with-mini-maker.ss ----------------------------------
#lang scheme
(require (for-syntax syntax/strip-context))

(provide (rename-out [module-begin #%module-begin]))

(define-syntax (module-begin stx)
  (syntax-case stx ()
    [(_ req)
     #'(#%plain-module-begin
        (require req)
        (provide with-mini)
        (define-syntax (with-mini stx)
          (syntax-case stx ()
            [(_ expr)
             (replace-context #'req (strip-context #'expr))])))]))

---- example use of with-mini.ss -------------------------
#lang scheme
(require "with-mini.ss")

(list (with-mini (1+ 0))
      (with-mini (1+ (1+ 0))))




Posted on the users mailing list.