www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
Mmeval.lisp | 19+++++++++++++++----
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))