case-analysis.lisp (1425B)
1 ;; -*- mode: Lisp; indent-tabs-mode: nil; -*- 2 3 (defun case-analysis (expr env) 4 (if (atom expr) 5 (if (constantp expr) 6 ;; cas literal 7 (let ((cell (<search> expr env))) 8 (if cell 9 ;; cas d'une variable 10 (<signal> "~S n'est pas une variable" expr)))) 11 (cond ((and (listp (car expr)) (eq (caar expr) 'lambda)) 12 ;; cas lambda fonction => recursivite 13 ) 14 ((not (symbolp (car expr))) 15 (<signal> "~S n'est pas une fonction" (car expr))) 16 ((not (fboundp (car expr))) 17 (<signal> "le symbole ~S n'a pas de definition fonctionnelle" (car expr))) 18 ((special-form-p (car expr)) 19 (case (car expr) 20 (quote `(:const . ,(cadr expr))) ;cas quote 21 (if `(:if ,(case-analysis (cadr expr) env) 22 ,(case-analysis (caddr expr) env) 23 . ,(case-analysis (cadddr expr) env))) 24 (defun ;; traitement du cas defun pas de recusivite ou sur le corps du defun 25 (case-analysis (fourth expr) (<build> (third expr)))) 26 (T (<signal> "~S NYI" (car expr))))) 27 ((macro-function (car expr)) 28 ;; cas des macros 29 ) 30 (;; cas des fonctions locales -> env fonctionnel 31 ) 32 (T ;; cas des fonctions globales recursion 33 (map-case-analysis (cdr expr) env)))))