我想写一个宏,写一堆宏的Lisp宏,但我有问题生成宏代码,使用splice运算符(在建立绑定),扩展内部表达式第一。编写一个Lisp宏与嵌套quasiquoting
(defmacro define-term-construct (name filter-p list-keywords)
(let* ((do-list-name (output-symbol "do-~a-list" name))
(with-name (output-symbol "with-~a" name))
(do-filter-name (output-symbol "do-~as" name)))
`(progn
(defmacro ,do-list-name
(ls (&key ,@(append list-keywords '(id operation))) &body body)
(with-gensyms (el)
`(loop-list (,el ,ls :id ,id :operation ,operation)
(let (XXX,@(build-bind ,,name ,el))
(when (,',filter-p ,el)
(,',with-name ,el
,@body)))))))))
后第一遍我想:
(define-term-construct some some-p (args name))
->
(PROGN
(DEFMACRO DO-SOME-LIST (LS (&KEY ARGS NAME ID OPERATION) &BODY BODY)
(WITH-GENSYMS (EL)
`(LOOP-LIST (,EL ,LS :ID ,ID :OPERATION ,OPERATION)
(LET (,@(BUILD-BIND ,SOME ,EL))
(WHEN (SOME-P ,EL)
(WITH-SOME ,EL
,@BODY)))))))
任何想法,我应该用什么报价/ quasiquotes以获得所需的代码?
您应该更完整地显示您的代码。也就是说,包括你所有的宏的辅助函数,比如'do-list-name'等。 – Kaz 2012-03-22 05:21:55
do-list-name将是'define-term-construct'生成的宏。我只想知道如何在嵌套quasiquotting中输出拼接操作符。 – 2012-03-22 05:44:30
'输出符号'就像'(intern(格式无))'我接受它。 –
Kaz
2012-03-22 07:21:25