At Sat, 9 May 2015 06:59:53 -0600, Matthew Flatt wrote:
> At Thu, 16 Apr 2015 17:39:50 -0400, "Alexander D. Knauth" wrote:
> > 
> > On Apr 16, 2015, at 8:17 AM, Matthew Flatt <[email protected]> wrote:
> > 
> > > I don't think a "hygienic" reader extension works in the old expander,
> > > either. The `lambda` produced by the `afl` or `rackjure` reader doesn't
> > > reliably refer to the `lambda` from `racket/base`, because a local
> > > binding for `lambda` captures the reader-produced `lambda`:
> > > 
> > > #lang rackjure
> > > (let ([lambda 5])
> > >   #λ(+ % 1)) ; => unbound `%1`
> > 
> > I just solved this problem for afl! (with the current macro expander)
> > 
> https://github.com/AlexKnauth/afl/commit/130216c2b85077aef893f7d0828d69394bceec
> e
> > 7
> 
> Yes, with the current expander, adding a fresh mark on the
> reader-introduced identifiers makes them impossible to bind (except by
> picking apart the form produced by `#λ...` to extract the special
> identifiers).
> 
> Although that strategy doesn't work with the set-of-scopes expander,

Another idea:

Adding a fresh mark isn't sufficient, because the reader-introduced
identifier will still have all the marks of the enclosing module, and
so it will see any bindings created by the module.

You want the reader-introduced identifier to be *missing* a scope that
the module has, so it won't see any of the module's bindings. It occurs
to me now that you can arrange it to be missing a scope, because `#lang
afl` controls the `read-syntax` call for the entire module. That
`read-syntax` can be wrapped to add a scope, and the scope can be
canceled for the reader-introduced identifiers in the readtable action
for `#λ`.


Specifically, starting back with the pre-set-of-scopes implementation
of afl's "reader.rkt", add

 (define current-afl-introduce (make-parameter values))

and set the new parameter in `wrap-reader` to a scope-toggling
function:

 (define (wrap-reader p)
   (lambda args
     (define orig-readtable (current-readtable))
     (define introduce (make-syntax-introducer))
     (parameterize ([current-readtable (make-afl-readtable orig-readtable)]
                    [current-afl-introduce introduce])
       ;; This is not quote right, because `p` could be `read`
       ;; instead of `read-syntax`. Maybe check that the result from
       ;; `(apply p args)` is  syntax object, and use `introduce` only
       ;; then:
       (introduce (apply p args)))))

and use the parameter's value in `parse` instead of creating an
introducer there:

  (define (parse ....)
    ....
    (define intro (current-afl-introduce))
    ....)

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-dev/20150718213105.049DA6501D0%40mail-svr1.cs.utah.edu.
For more options, visit https://groups.google.com/d/optout.

Reply via email to