[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: syntax-locally-bound-identifiers, local-eval
From: |
Mark H Weaver |
Subject: |
Re: syntax-locally-bound-identifiers, local-eval |
Date: |
Fri, 20 Jan 2012 14:04:20 -0500 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.0.92 (gnu/linux) |
Hi Andy. Thanks for following through on this. As you probably
noticed, my motivation to work on `local-eval' has largely dissipated,
so it's great that you finished this up in time for 2.0.4.
I haven't yet had time to fully review these patches, but for now, a
quick scan reveals a few remaining problems. See below:
Andy Wingo <address@hidden> writes:
> +(define-syntax the-environment
> + (lambda (x)
> + (syntax-case x ()
> + ((the-environment)
> + #'(the-environment the-environment))
> + ((the-environment scope)
> + (call-with-values (lambda ()
> + (analyze-identifiers
> + (syntax-locally-bound-identifiers #'scope)))
> + (lambda (capture formals wrappers patterns)
> + (define (wrap-expression x)
> + (let lp ((x x) (wrappers wrappers))
> + (if (null? wrappers)
> + x
> + (lp ((car wrappers) x) (cdr wrappers)))))
> + (with-syntax ((module (datum->syntax #'here (module-name
> (current-module))))
***** Again, the module must be the one embedded in `scope', not the
(current-module). I guess this is a reminder that I need to add a more
thorough set of regression tests for `local-eval'.
> +(define (local-eval x e)
> + "Evaluate the expression @var{x} within the lexical environment @var{e}."
> + (cond ((lexical-environment? e)
> + (apply (eval (local-expand x e) (lexenv-module e))
> + (lexenv-boxes e)))
> + ((module? e)
> + ;; Here we evaluate the expression within `lambda', and then
> + ;; call the resulting procedure outside of the dynamic extent
> + ;; of `eval'. We do this because `eval' sets (current-module)
> + ;; within its dynamic extent, and we don't want that. Also,
> + ;; doing it this way makes this a proper tail call.
> + ((eval #`(lambda () #,x) e)))
***** Again, there should be an `#f' before `#,x' here, to force
expression context (my mistake).
> + (else (error "local-eval: invalid lexical environment" e))))
> +
> +(define* (local-compile x e #:key (opts '()))
> + "Compile and evaluate the expression @var{x} within the lexical
> environment @var{e}."
> + (cond ((lexical-environment? e)
> + (apply (compile (local-expand x e)
> + #:env (lexenv-module e)
> + #:from 'scheme #:opts opts)
> + (lexenv-boxes e)))
> + ((module? e)
> + ;; Here we compile the expression within `lambda', and then
> + ;; call the resulting procedure outside of the dynamic extent
> + ;; of `compile'. We do this because `compile' sets
> + ;; (current-module) during evaluation, and we don't want that.
> + ((compile #`(lambda () #,x)
***** Ditto.
> + #:env e #:from 'scheme #:opts opts)))
> + (else (error "local-compile: invalid lexical environment" e))))
I'll try to do a more thorough review later.
Thanks,
Mark
Re: syntax-locally-bound-identifiers, local-eval, Ludovic Courtès, 2012/01/21