clisp provides a facility to evaluate a form in a non null lexical environment. It works as follows
(let ((a 1) (b 2))
(ext:eval-env '(format t "a is ~A b is ~A~%" a b) (ext:the-environment))) a is 1 b is 2 NIL
The clisp documentation gives Macro EXT:THE-ENVIRONMENT. As in Scheme, the macro (EXT:THE-ENVIRONMENT) returns the current lexical environment. This works only in interpreted code and is not compilable!
Function (EXT:EVAL-ENV form &OPTIONAL environment). evaluates a form in a given lexical environment, just as if the form had been a part of the program that the environment came from.
I was wondering if ECL has something analogous or could be added easily. Looking in the ECL source I saw a si::eval-with-env function in file ecl-16.1.3/src/c/compiler.d .If you do
(find-symbol "EVAL-WITH-ENV" "SYSTEM")
SI:EVAL-WITH-ENV :EXTERNAL
which suggests that the function is not just for internal use. But scanning the documentation , I didn't see it mentioned. I tried
(defmacro env-eval (form &environment env) `(ext:eval-with-env ,form (quote ,env))) ENV-EVAL
(let ((v 12)) (env-eval '(print v)))
The variable V is unbound. Broken at EVAL.No restarts available. Broken at EVAL.
So is there a way to achieve this ?