summaryrefslogtreecommitdiff
path: root/runtime/evalenv.lsp
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/evalenv.lsp')
-rw-r--r--runtime/evalenv.lsp36
1 files changed, 36 insertions, 0 deletions
diff --git a/runtime/evalenv.lsp b/runtime/evalenv.lsp
new file mode 100644
index 0000000..155139f
--- /dev/null
+++ b/runtime/evalenv.lsp
@@ -0,0 +1,36 @@
+;;
+;; The EVAL function in the original XLISP evaluated in the current lexical
+;; context. This was changed to evaluate in the NIL (global) context to
+;; match Common Lisp. But this created a problem: how do you EVAL an
+;; expression in the current lexical context?
+;;
+;; The answer is you can use the evalhook facility. The evalhook function
+;; will evaluate an expression using an environment given to it as an
+;; argument. But then the problem is "how do you get the current
+;; environment?" Well the getenv macro, below obtains the environent by
+;; using an *evalhook* form.
+;;
+;; The following two macros do the job. Insteading of executing (eval <expr>)
+;; just execute (eval-env <expr>). If you want, you can dispense with the
+;; macros and execute:
+;;
+;;(evalhook <expr> nil nil (let ((*evalhook* (lambda (x env) env)))
+;; (eval nil)))
+;;
+;; Tom Almy 10/91
+;;
+
+(defmacro getenv ()
+ '(progv '(*evalhook*)
+ (list #'(lambda (exp env) env))
+ (eval nil)))
+
+; this didn't work, may be for a later (Almy) version of xlisp?
+;(defmacro getenv ()
+; '(let ((*evalhook* (lambda (x env) env)))
+; (eval nil))) ; hook function evaluates by returning
+ ; environment
+
+(defmacro eval-env (arg) ; evaluate in current environment
+ `(evalhook ,arg nil nil (getenv)))
+