www

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

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)))))