commit 797b87f598812f4c3dca305cc13a18e8d56f4b65 Author: Bertrand BRUN <bertrand.brun@me.com> Date: Sat, 2 Oct 2010 17:32:12 +0200 Ajout de la fonction d'analyse de cas Diffstat:
| A | case-analysis.lisp | | | 32 | ++++++++++++++++++++++++++++++++ |
1 file changed, 32 insertions(+), 0 deletions(-)
diff --git a/case-analysis.lisp b/case-analysis.lisp @@ -0,0 +1,31 @@ +(defun case-analysis (expr env) + (if (atom expr) + (if (constantp expr) + ;cas literal + (let ((cell (<search> expr env))) + (if cell + ; cas d'une variable + (<signal> "~S n'est pas une variable" expr)))) + (cond ((and (listp (car expr)) (eq (caar expr) 'lambda)) + ;cas lambda fonction => recursivite + ) + ((not (symbolp (car expr))) + (<signal> "~S n'est pas une fonction" (car expr))) + ((not (fboundp (car expr))) + (<signal> "le symbole ~S n'a pas de definition fonctionnelle" (car expr))) + ((special-form-p (car expr)) + (case (car expr) + (quote `(:const . ,(cadr expr))) ;cas quote + (if `(:if ,(case-analysis (cadr expr) env) + ,(case-analysis (caddr expr) env) + . ,(case-analysis (cadddr expr) env))) + (defun ;traitement du cas defun pas de recusivite ou sur le corps du defun + (case-analysis (fourth expr) (<build> (third expr)))) + (T (<signal> "~S NYI" (car expr))))) + ((macro-function (car expr)) + ;cas des macros + ) + (;cas des fonctions locales -> env fonctionnel + ) + (T ;cas des fonctions globales recursion + (map-case-analysis (cdr expr) env))))) +\ No newline at end of file