Mark H Weaver <[email protected]> writes:
> Hi Noah,
>
> Noah Lavine <[email protected]> writes:
>> Perhaps this is obvious to everyone else, but it just occurred to me
>> that (capture-local-environment) is just
>> (call-with-current-continuation), but running in the environment of
>> the evaluator instead of the program being evaluated. It's as though
>> the evaluator was going to look in a tree for more code, but hit a
>> special node and did a (call/cc). I hope other people find this
>> interesting.
>
> Ah yes, that's an excellent point!
(define (my-eval form env)
(call-with-current-continuation
(lambda (x)
(env (list x form)))))
(define-macro (my-env)
(call-with-current-continuation
identity))
(format #t "~a" (my-eval '(+ x 3) (let ((x 4)) (my-env))))
> In fact it makes me wonder whether `the-environment' and `local-eval'
> could actually be implemented this way. I see some complications that
> might make this strategy impractical or fragile, most notably that we
> must be assured that the (call/cc) does not happen until
> (the-environment) would have been _evaluated_, whereas the
> expander/memoizer/evaluator will want to see what code is there _before_
> evaluation. I'll have to think about this. There might be an easy and
> robust way to do this, or maybe not.
Feel free to experiment with the above. I have my doubt that it leads
to sane behavior. In particular, it will refinish macro expansion (so
you don't want significant material behind it) and reevaluate the
_whole_ eval it is in up to the point of calling my-env (so you don't
want significant material before it).
So it is more a joke than anything of practical value. But is _is_ good
for a few dropjaws.
--
David Kastrup