commit b154264f1ad40063fb9fb557d77484b2c719f042
parent e80b555d9c6dfaa92790a05809aec37beab32ac2
Author: Bertrand BRUN <bertrand.brun@me.com>
Date: Sun, 31 Oct 2010 02:45:19 +0200
Correction de la fonction print-env-stack pour quel puisse afficher correctement l'environnement, lisp2li gere maintenant correctement les lambda-expressions et les defuns
Diffstat:
2 files changed, 34 insertions(+), 19 deletions(-)
diff --git a/environnement.lisp b/environnement.lisp
@@ -93,12 +93,21 @@ l'environnement top-level."
env-stack)
(defun print-env-stack (env-stack)
- (if (atom env-stack)
- nil
- (progn (format t "~&~a: " (caar env-stack))
- (mapcar (lambda (b) (format t "~& ~w = ~w" (car b) (cdr b)))
- (cdar env-stack))
- (print-env-stack (cdr env-stack)))))
+ (let ((*print-circle* t))
+ (if (atom env-stack)
+ nil
+ (progn (format t "~&~a: " (caar env-stack))
+ (mapcar (lambda (b) (format t "~& ~w = ~w" (car b) (cdr b)))
+ (cdar env-stack))
+ (print-env-stack (cdr env-stack))))))
+
+;(defun print-env-stack (env-stack)
+; (if (atom env-stack)
+; nil
+; (progn (format t "~&~a: " (caar env-stack))
+; (mapcar (lambda (b) (format t "~& ~w = ~w" (car b) (cdr b)))
+; (cdar env-stack))
+; (print-env-stack (cdr env-stack)))))
;;Test Unitaire
(deftest environnement
diff --git a/lisp2li.lisp b/lisp2li.lisp
@@ -1,4 +1,4 @@
-;; TODO : reste a gerer les defuns, les let, les lambda expression, les setf, les progn, ...
+(load "environnement")
(defun lisp2li (expr env)
"Convertit le code LISP en un code intermédiaire reconnu
par le compilateur et par l’interpréteur"
@@ -10,16 +10,20 @@ par le compilateur et par l’interpréteur"
(if cell
(cons :var (car cell))
(warn "Variable ~S unknown" expr))))
+ ((eq 'lambda (car expr))
+ (let ((env-bis (make-stat-env (push-new-env env "LAMBDA") (second expr))))
+ `(:lclosure ,env-bis
+ ,(lisp2li (third expr)
+ env-bis))))
((and (consp (car expr))
(eq 'lambda (caar expr)))
- ;; λ-expressions
- ;; => recursion sur arguments
- ;; => construction environnement
- ;; => recursion sur corps de la λ-fonction
- (error "Lambda expression NYI"))
+ `(:call ,(lisp2li (car expr) env)
+ ,@(mapcar (lambda (param)
+ (lisp2li param env))
+ (cdr expr))))
((not (symbolp (car expr)))
(warn "~S isn't a symbol" (car expr)))
- ((get-binding env (car expr))
+ ((and (not (fboundp (car expr))) (not (get-binding env (car expr))))
(list :unknown expr env))
((eq 'if (car expr)) ; if
(list :if
@@ -29,12 +33,12 @@ par le compilateur et par l’interpréteur"
((eq 'quote (car expr)) ;; quotes
(cons :lit (second expr)))
((eq 'defun (car expr)) ;; TODO : a verifier que le cas de defun est bien gerer comme on le veux
- (add-top-level-binding env
- (second expr)
- (cons :lclosure (list (length (third expr))
- (lisp2li (fourth expr)
- (make-stat-env (push-new-env env "DEFUN")
- (third expr))))))
+ (let ((env-bis (make-stat-env (push-new-env env "DEFUN") (third expr))))
+ (add-top-level-binding env
+ (second expr)
+ (cons :lclosure (cons env-bis
+ (lisp2li (fourth expr)
+ env-bis)))))
(cons :lit (second expr)))
((eq 'setq (car expr))
(cons :call (cons 'set-binding (list `(:lit . ,env)
@@ -134,4 +138,6 @@ par le compilateur et par l’interpréteur"
(lisp2li '(setq x 2) env)
'(:call set-binding (:lit . (("TOP-LEVEL" (x . 1)))) (:lit . x) (:lit . 2)))
+;; Test sur le defun
+
;(run-tests t)
\ No newline at end of file