commit 5b323b2c46c57884ae2634bda901b3489c636658
parent 69f9180bb2978a7224f17d2d01afa7b3f4ffae7f
Author: Bertrand BRUN <bertrand.brun@me.com>
Date: Sat, 6 Nov 2010 02:27:40 +0100
Ajout du cas de :cvar dans le meval
Diffstat:
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/meval.lisp b/meval.lisp
@@ -1,12 +1,23 @@
(load "match")
+
+(defun get-env-num (num env)
+ (defun get-env-num-t (num env counter)
+ (cond ((= counter num) env)
+ ((eq (aref env 0) nil) nil)
+ (T
+ (get-env-num-t num (aref env 0) (+ 1 counter))
+ )))
+ (get-env-num-t num env 0))
+
(defun meval (expr &optional env)
"Interprète le langage intermédiaire passé en paramètre."
(cond ((match :const (first expr))
(cdr expr))
((match :cvar (first expr))
- )
- ((match :lclosure (first expr))
- )
+ (let ((sub-env (get-env-num (second expr) env)))
+ (if sub-env
+ (aref sub-env (third expr))
+ (error "The variable ~S is unbound" (cdr expr)))))
(T
(error "form special ~S not yet implemented" expr))))
@@ -46,7 +57,7 @@
(deftest (meval quote)
(meval (lisp2li '''3 ()))
- '3)
+ ''3)
(deftest (meval :cvar)
(meval (lisp2li 'x '((x 0 2))) #(() 4 5 6))