commit a61756303474bf71f86ad7e3f849888d5c283783
parent 1a64d2a62d4a6ccde6fe227715c63863d2409e85
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Fri, 14 Jan 2011 00:58:00 +0100
bug quasiquotes.
Diffstat:
3 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/lisp/mini-meval.lisp b/lisp/mini-meval.lisp
@@ -288,6 +288,15 @@
; (etat-local etat)
; (etat-special etat)))
+;; `
+(defvar my-quasiquote (car '`(,a)))
+
+;; ,
+(defvar my-unquote (caaadr '`(,a)))
+
+;; ,@
+(defvar my-unquote-splice (caaadr '`(,@a)))
+
(defun transform-quasiquote (expr)
(cond
;; a
@@ -298,11 +307,11 @@
`(cons ',(car expr)
,(transform-quasiquote (cdr expr))))
;; (,a)
- ((eq 'unquote (caar expr))
+ ((eq my-unquote (caar expr))
`(cons ,(cadar expr)
,(transform-quasiquote (cdr expr))))
;; (,@a)
- ((eq 'unquote-splice (caar expr))
+ ((eq my-unquote-splice (caar expr))
(if (endp (cdr expr))
(cadar expr)
`(append ,(cadar expr)
@@ -312,6 +321,7 @@
`(cons ,(transform-quasiquote (car expr))
,(transform-quasiquote (cdr expr))))))
+
#|
Mini-meval est un meval très simple destiné à évaluer les macros et les autres directives avec eval-when :compile-toplevel.
@@ -327,10 +337,10 @@ Mini-meval sera appellé sur des morceaux spécifiques du fichier source. Il fau
3) Sinon, c'est un appel de fonction.
Pour permettre au code de bas niveau de redéfinir les formes spéciales, on fera d'abord la macro-expansion (étape 2).
|#
-
+;(print
(cond-match
expr
- ((quasiquote :val . _)
+ (((? (eq x my-quasiquote)) :val _)
(mini-meval (transform-quasiquote val) etat))
#| 2) Cas des macros |#
((:name $$ :params _*)
@@ -524,7 +534,10 @@ Mini-meval sera appellé sur des morceaux spécifiques du fichier source. Il fau
(let ((definition (assoc-etat expr 'variable etat)))
(if definition
(cdr definition)
- (mini-meval-error expr etat "Undefined variable : ~w." expr))))))
+ (mini-meval-error expr etat "Undefined variable : ~w." expr))))
+ (_
+ (error "mini-meval : this is unsupported : ~a" expr))))
+;)
(defun push-functions (etat functions)
(dolist (f functions)
diff --git a/lisp/t.lisp b/lisp/t.lisp
@@ -2,7 +2,7 @@
(load "mini-meval")
(defvar tmm nil)
-(setq tmm (my-read (open "tmm.lisp")))
+(setq tmm (read (open "tmm.lisp")))
(defvar e-tmm nil)
;(setq e-tmm (make-etat list + - cons car cdr < > <= >= = make-symbol))
@@ -64,4 +64,6 @@
mload
mini-meval
make-symbol
+ print
+ endp
))
diff --git a/lisp/tmm.lisp b/lisp/tmm.lisp
@@ -903,7 +903,6 @@
,(transform-quasiquote (cdr expr))))))
(defun mini-meval (expr &optional (etat (list nil nil nil)))
-
(cond-match
expr
((quasiquote :val . _)