From 5416bb34d8e7cbbe6a45483e0540e747dffc19ec Mon Sep 17 00:00:00 2001 From: Bertrand BRUN Date: Fri, 12 Nov 2010 23:38:36 +0100 Subject: [PATCH] Ajout du cas du defmacro (pas encore fini) --- lisp2li.lisp | 10 +++++++++- meval.lisp | 17 ++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lisp2li.lisp b/lisp2li.lisp index fb81b1d..3bc3b67 100644 --- a/lisp2li.lisp +++ b/lisp2li.lisp @@ -160,7 +160,11 @@ par le compilateur et par l’interpréteur" ;; fonction meta-definie ((get (car expr) :defun) `(:mcall ,(car expr) - ,@(mapcar (lambda (x) (lisp2li x env)) (cdr expr)))) + ,@(mapcar (lambda (x) (lisp2li x env)) (cdr expr)))) + ;; macro meta-definie + ((get (car expr) :defmacro) + `(:mcall ,(car expr) + ,@(mapcar (lambda (x) (lisp2li x env)) (cdr expr)))) ;; fonction inconnue ((and (not (fboundp (car expr))) (not (get (car expr) :defun))) @@ -204,6 +208,10 @@ par le compilateur et par l’interpréteur" ((eq 'defun (car expr)) `(:mcall set-defun (:const . ,(second expr)) ,(lisp2li `(lambda ,(third expr) ,@(cdddr expr)) env))) + ;; defmacro + ((eq 'defmacro (car expr)) + `(:mcall set-defmacro (:const . ,(second expr)) + ,(lisp2li `(lambda ,(third expr) ,@(cdddr expr)) env))) ;; apply ((eq 'apply (car expr)) `(:sapply ,(second expr) ,@(cddr expr))) diff --git a/meval.lisp b/meval.lisp index 35377f7..95abda6 100644 --- a/meval.lisp +++ b/meval.lisp @@ -85,9 +85,6 @@ retourne la liste de leurs valeurs" (defun meval-lambda (lclosure args env) "Applique une λ-fonction quelconque à des valeurs d’arguments dans un certain environnement." - (print "meval-lambda") - (print env) - (print args) (match (:nil :lclosure :size (? integerp) :rest (? integerp)? :body _*) lclosure (meval lclosure (make-env size args env rest)))) @@ -111,7 +108,6 @@ d’arguments dans un certain environnement." (defun meval (expr &optional (env #())) "Interprète le langage intermédiaire passé en paramètre." - (print expr) (cond-match expr ((:nil :const :val . _) expr val) ((:nil :cvar :num-env (? integerp) :index (? integerp)) @@ -129,13 +125,24 @@ d’arguments dans un certain environnement." (let ((name (meval func-name env))) (setf (get name :defun) closure) name)) - ((:nil :mcall :func-name $ :params _*) + ((:nil :mcall set-defmacro :macro-name @. :closure _*) + (let ((name (meval macro-name env))) + (setf (get name :defmacro) closure) + name)) + ((:nil :mcall :func-name (? (get x :defun)) :params _*) (let ((values (meval-args params env))) (meval-lambda (car (get func-name :defun)) values (make-env (length values) values env)))) + ((:nil :mcall :macro-name (? (get x :defmacro)) :params _*) + (let ((values (meval-args params env))) + (meval (lisp2li (meval-lambda (car (get macro-name :defmacro)) + params + (make-env (length values) + values + env)) env) env))) ((:nil :mcall :lambda (:nil :lclosure (? integerp) (? integerp)? _*) :args _*) (meval-lambda lambda (meval-args args env) env)) ((:nil :call :func-name _ :body _*)