Mark H Weaver <m...@netris.org> writes: > Hi Noah, > > Noah Lavine <noah.b.lav...@gmail.com> 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