From 64b82900333cc89ca3422a4447ed1d3034e5a96e Mon Sep 17 00:00:00 2001 From: David Vazquez Date: Sun, 16 Dec 2012 15:32:12 +0000 Subject: [PATCH] Include backquote without simplifications --- backquote.lisp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 backquote.lisp diff --git a/backquote.lisp b/backquote.lisp new file mode 100644 index 0000000..508fc3f --- /dev/null +++ b/backquote.lisp @@ -0,0 +1,52 @@ +;;; A little backquote implementation without optimizations of any +;;; kind for lispstrack. + +(defun backquote-expand-1 (form) + (cond + ((symbolp form) + (list 'quote form)) + ((atom form) + form) + ((eq (car form) 'unquote) + (car form)) + ((eq (car form) 'backquote) + (backquote-expand-1 (backquote-expand-1 (cadr form)))) + (t + (cons 'append + (mapcar (lambda (s) + (cond + ((and (listp s) (eq (car s) 'unquote)) + (list 'list (cadr s))) + ((and (listp s) (eq (car s) 'unquote-splicing)) + (cadr s)) + (t + (list 'list (backquote-expand-1 s))))) + form))))) + +(defun backquote-expand (form) + (if (and (listp form) (eq (car form) 'backquote)) + (backquote-expand-1 (cadr form)) + form)) + +(defmacro backquote (form) + (backquote-expand-1 form)) + +;;; Tests. Compare backquote agains the backquote of the host Lisp. +(macrolet ((test (form1 form2) + `(assert (equal ,form1 ,form2)))) + (test (backquote (1 2 3 4)) + `(1 2 3 4)) + (test (backquote (1 2 (+ 3 4))) + `(1 2 (+ 3 4))) + (test (backquote (1 2 (unquote (+ 3 4)))) + `(1 2 ,(+ 3 4))) + (test (backquote (1 2 (unquote-splicing '(3 4)))) + `(1 2 ,@'(3 4))) + (test (backquote (backquote x)) + ``x) + (let ((x 10)) + (test `',x + (backquote (quote (unquote x))))) + (let ((x 10)) + (test (eval ``(,,x)) + (eval (backquote (backquote ((unquote (unquote x))))))))) -- 1.7.10.4