diff --git a/lisp2li.lisp b/lisp2li.lisp index 229b7ae..580683f 100644 --- 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 index 63dd409..dca0baa 100644 --- 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 index ab6d4bc..539367b 100644 --- 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)))