www

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

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:
Menvironnement.lisp | 21+++++++++++++++------
Mlisp2li.lisp | 32+++++++++++++++++++-------------
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