www

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

commit 8642e2cf466644a32340423713a83d6c594892e0
parent 1bd2db29f63a8abff8d73a2e7c9c71cabb77b322
Author: Bertrand BRUN <bertrand.brun@me.com>
Date:   Sat,  6 Nov 2010 00:16:23 +0100

Ajout d'une fonction permettant de calculer le nombre exacte de paramettre de la fonction (ne compte pas les &optional et &rest) + utilisation de cette fonction dans le cas du lambda

Diffstat:
Mlisp2li.lisp | 27++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/lisp2li.lisp b/lisp2li.lisp @@ -59,7 +59,19 @@ (T `(cons ,(transform-quasiquote (car expr)) ,(transform-quasiquote (cdr expr)))))) - + +(defun get-nb-params (params) + "renvoie le nombre exact de paramètres sans les &optional et &rest" + (defun get-nb-params-t (params r) + (cond ((endp params) + r) + ((or (eq '&optional (car params)) + (eq '&rest (car params))) + (get-nb-params-t (cdr params) r)) + (T + (get-nb-params-t (cdr params) (+ 1 r))))) + (get-nb-params-t params 0)) + (defun lisp2li (expr env) "Convertit le code LISP en un code intermédiaire reconnu par le compilateur et par l’interpréteur" @@ -74,10 +86,15 @@ par le compilateur et par l’interpréteur" `(:cvar ,(cadr cell) ,(caddr cell)) (error "Variable ~S unknown" expr)))) ;; lambda solitaire ex: (lambda (x) x) - ((eq 'lambda (car expr)) - `(:lclosure . ,(cons (length (second expr)) - (lisp2li (caddr expr) - (make-stat-env (second expr)))))) + ((eq 'lambda (car expr)) ;; TODO : ameliorer le cas du lambda + (if (member '&rest (second expr)) + `(:lclosure . (,(get-nb-params (second expr)) + ,(+ 1 (position '&rest (second expr))) + ,(lisp2li (caddr expr) + (make-stat-env (second expr))))) + `(:lclosure . ,(cons (get-nb-params (second expr)) + (lisp2li (caddr expr) + (make-stat-env (second expr))))))) ;; lambda ex: ((lambda (x) x) 1) ((and (consp (car expr)) (eq 'lambda (caar expr)))