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.