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