Ajout du cas du let dans meval

This commit is contained in:
Bertrand BRUN 2010-11-08 19:51:09 +01:00
parent 2905eaf456
commit 25e891e6fc
3 changed files with 34 additions and 12 deletions

View File

@ -329,3 +329,34 @@ par le compilateur et par linterpréteur"
(:call eq (:call car (:const 1 2)) (:const . 1)))
(:const . nil)
(:const . T)))
(deftest (lisp2li let)
(lisp2li '(let ((x 1) (y 2))
(cons x y)) ())
'(:let 2 (:set-var (0 1) (:const . 1))
(:set-var (0 2) (:const . 2))
(:call cons (:cvar 0 1) (:cvar 0 2))))
(deftest (lisp2li let)
(lisp2li '(let ((x 1) (y 2))
(cons x y)
(list x y)) ())
'(:let 2 (:set-var (0 1) (:const . 1))
(:set-var (0 2) (:const . 2))
(:progn
(:call cons (:cvar 0 1) (:cvar 0 2))
(:call list (:cvar 0 1) (:cvar 0 2)))))
(deftest (lisp2li let)
(lisp2li '(let ((x z) (y 2))
(cons x y)) '((z 0 1)))
'(:let 2 (:set-var (1 1) (:cvar 0 1))
(:set-var (1 2) (:const . 2))
(:call cons (:cvar 1 1) (:cvar 1 2))))
(deftest (lisp2li let)
(lisp2li '(let ((x 2))
(cons x z)) '((z 0 1)))
'(:let 1 (:set-var (1 1) (:const . 2))
(:call cons (:cvar 1 1) (:cvar 0 1))))

View File

@ -61,17 +61,6 @@ du &rest dans une cellule de l'env sous forme d'une liste"
(defun map-meval (list env)
(mapcar (lambda (x) (meval x env)) list))
(defun meval-progn (list env)
"Mevalue toutes les sous expressions et renvoie
la valeur de la dernier"
(if (endp list)
nil
(if (endp (cdr list))
(meval (car list) env)
(progn
(meval (car list) env)
(meval-progn (cdr list) env)))))
(defun meval-body (list-expr env)
"Évalue en séquence la liste des expressions et
retourne la valeur retournée par la dernière"
@ -135,6 +124,8 @@ darguments dans un certain environnement."
(meval-body `(,body) env))
((:nil :set-var :place @. :value _)
(msetf place value env))
((:nil :let :size (? integerp) :affectations (:nil :set-var :places @ :values _)* :body _*)
(meval-body body (make-env size (meval-args values env) env)))
(_*
(error "form special ~S not yet implemented" expr))))

View File

@ -132,7 +132,7 @@
(erase-tests test-unitaire)
(deftest (test-unitaire copy-all)
(let* ((foo #(a b (1 #(2 4 6) 3) c))
(let* ((foo #(a b (1 #(2 4 6) 3) c))
(copy-of-foo (copy-all foo)))
copy-of-foo
(setf (aref (cadr (aref copy-of-foo 2)) 1) (cons 'MODIFIED (random 42)))