commit 74fea3397cf6fc3162951e6146ba200faed452b3
parent 1fb31367c8ade216a90e006ee401b169e50d896e
Author: Bertrand BRUN <bertrand.brun@me.com>
Date: Mon, 8 Nov 2010 14:34:57 +0100
Ajout du cas des labels dans lisp2li
Diffstat:
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/lisp2li.lisp b/lisp2li.lisp
@@ -44,7 +44,7 @@
`(cons ,(transform-quasiquote (car expr))
,(transform-quasiquote (cdr expr))))))
-(defun lisp2li (expr env-var env-fun)
+(defun lisp2li (expr &optional env-var env-fun)
"Convertit le code LISP en un code intermédiaire reconnu
par le compilateur et par l’interpréteur"
(cond ((null env-var) (lisp2li expr (empty-env-stack) env-fun))
@@ -127,6 +127,15 @@ par le compilateur et par l’interpréteur"
`(let (,(car bindings))
(let* ,(cdr bindings)
,body))) env-var env-fun)))
+ ;; labels
+ ((eq 'labels (car expr))
+ (let ((bindings (cadr expr))
+ (body (caddr expr))
+ (env-bis (push-new-env env-fun "LABELS")))
+ (mapcar (lambda (x) (add-binding env-bis (car x)
+ (lisp2li `(lambda ,(cadr x) ,(cddr x)) env-var env-bis)))
+ bindings)
+ `(:lclosure (,env-var ,env-bis) ,(lisp2li body env-var env-bis))))
;; progn
((eq 'progn (car expr))
(cons :progn (map-lisp2li (cdr expr) env-var env-fun)))