;;; -*- Mode:LISP; Package:READ; Readtable:CL; Base:10 -*-

(defmacro backquote (argument)


(backquote (foo bar)) --> (quote (foo bar))
(backquote foo) -> (quote foo)
(backquote (unquote foo)) -> foo

(backquote (foo bar)) -> (quote (foo bar))
(backquote ((unquote foo) bar)) -> (foo (quote bar))

`(,foo bar)

;;; (backquote (e1 e2 ... en . (unquote form)))



(defmacro backquote (expression)
  (list 
    'QUOTE
    (eval
      (cond ((vectorp expression)
	     `(VECTOR ,@(nbutlast 
			  (expand-backquoted-list (coerce expression 'list)))))
	    ((not (listp expression))
	     `(QUOTE ,expression))
	    ((eq (car expression) 'UNQUOTE)
	     `,(cadr expression))
	    ((or (eq (car expression) 'UNQUOTE-SPLICING)
		 (eq (car expression) 'DESTRUCTIVE-UNQUOTE-SPLICING))
	     (error "Can't unquote-splicing immediaely after backquote."))
	    ((eq (car expression) 'BACKQUOTE)
	     `(BACKQUOTE ,(macroexpand expression)))
	    (t
	     `(LIST* ,@(expand-backquoted-list expression)))))))
    

;;;(apply #'list* (expand-backquoted-list expression)))))








;`(quote foo)
;(append [quote] [foo])
;(append (list 'quote) (list 'foo))



