forked from dumbs/2010-m1s1-compilation
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcase-analysis.lisp
33 lines (32 loc) · 1.39 KB
/
case-analysis.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
;; -*- mode: Lisp; indent-tabs-mode: nil; -*-
(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)))))