www

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

commit 25e891e6fcafb89518fb9388fd504e623e8f693a
parent 2905eaf456d6dfd16cd23635cdc3c8878ce5918b
Author: Bertrand BRUN <bertrand.brun@me.com>
Date:   Mon,  8 Nov 2010 19:51:09 +0100

Ajout du cas du let dans meval

Diffstat:
Mlisp2li.lisp | 32++++++++++++++++++++++++++++++++
Mmeval.lisp | 13++-----------
Mtest-unitaire.lisp | 2+-
3 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/lisp2li.lisp b/lisp2li.lisp @@ -329,3 +329,34 @@ par le compilateur et par l’interpré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)))) + +\ No newline at end of file diff --git a/meval.lisp b/meval.lisp @@ -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 @@ d’arguments 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)))) diff --git a/test-unitaire.lisp b/test-unitaire.lisp @@ -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)))