I have successfully implemented the (capture-lexical-environment)
special form in the evaluator, and also primitive-local-eval.
Here's a transcript from a test session:
scheme@(guile-user)> (define env1 (primitive-eval '(let ((x 1) (y 2))
(capture-lexical-environment))))
scheme@(guile-user)> (primitive-local-eval 'x env1)
$2 = 1
scheme@(guile-user)> (primitive-local-eval 'y env1)
$3 = 2
scheme@(guile-user)> (primitive-local-eval '(set! x (+ x 10)) env1)
$4 = 11
scheme@(guile-user)> (primitive-local-eval 'x env1)
$5 = 11
scheme@(guile-user)> (define env2 (primitive-local-eval '(begin (set! x (+ x
1)) (let ((z 3)) (capture-lexical-environment))) env1))
scheme@(guile-user)> (primitive-local-eval 'z env2)
$7 = 3
scheme@(guile-user)> (primitive-local-eval 'x env2)
$8 = 12
scheme@(guile-user)> (primitive-local-eval 'y env2)
$9 = 2
Note that in addition to the evaluator and memoizer environments, I also
needed to add an expander environment to the overall lexical environment
object.
I will post a preliminary patch shortly. It's fairly small.
Mark