有没有办法引用阅读器宏的调用?更具体地说,我想创建一个宏,一旦评估,它将生成一个 defclass 语句和一个相应的 XML 文件。这可能吗?
我考虑过使用#.( ... )
阅读器宏,但我认为宏参数未绑定在阅读器宏中使用。它是否正确?
因此,我的第二个想法是尝试生成一个包含阅读器宏的语句,但我不确定是否有办法做到这一点。
在扩展宏调用时生成 XML 文件有什么建议吗?
提前感谢您的任何想法。
有没有办法引用阅读器宏的调用?更具体地说,我想创建一个宏,一旦评估,它将生成一个 defclass 语句和一个相应的 XML 文件。这可能吗?
我考虑过使用#.( ... )
阅读器宏,但我认为宏参数未绑定在阅读器宏中使用。它是否正确?
因此,我的第二个想法是尝试生成一个包含阅读器宏的语句,但我不确定是否有办法做到这一点。
在扩展宏调用时生成 XML 文件有什么建议吗?
提前感谢您的任何想法。
“阅读器宏”和“宏”是完全不同的野兽,用来做非常不同的事情。
“阅读器宏”通常是一个函数,首先。它们绑定到一个(或两个特定序列)字符,并改变读取源代码的方式。它们不是关于代码,而是关于对象创建。
对于“阅读器宏”,“宏参数”将是什么没有明显的定义(可能除了首先导致阅读器宏被调用的字符序列之外,对于作为例如,当您阅读列表时将a(
与 a匹配)。)
类似于以下内容:
(defmacro def-wsdl-class (name (&rest supers)
(&rest slots)
&rest options)
`(progn
(eval-when (:compile-toplevel :execute)
(with-open-file (xml-file (make-pathname :name (string-capitalize name)
:type "wsdl"
:defaults (or *compile-pathname*
*load-pathname*))
:direction :output
:if-exists ,(getf options :if-wsdl-exists :error))
(when xml-file
(spit-xml xml-file ',name ',supers ',slots ,@options))))
`(defclass ,name (,@supers)
(,@slots)
,@(chew options)))))
编辑:要回答您的原始问题,您通常不能(反)引用阅读器宏。它们在读取语法的地方执行,我们称之为读取时间。阅读器宏不参与正常的宏扩展,它们在宏扩展之前起作用。
您可能可以创建一个阅读器宏,该阅读器宏知道它在反引号阅读器宏中被调用以使用它,但它需要知道或更改反引号阅读器宏的实现相关行为。
但是,您可以从阅读器宏返回反引号表单。