From 5b323b2c46c57884ae2634bda901b3489c636658 Mon Sep 17 00:00:00 2001 From: Bertrand BRUN Date: Sat, 6 Nov 2010 02:27:40 +0100 Subject: [PATCH] Ajout du cas de :cvar dans le meval --- meval.lisp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/meval.lisp b/meval.lisp index 7c975ba..7d050ff 100644 --- 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))