关于Lisp:引用读者宏调用

Quote a reader macro invocation

是否可以引用阅读器宏的调用?更具体地说,我想创建一个宏,该宏一旦被评估,将生成defclass语句和相应的XML文件。这可能吗?

我考虑过使用#.( ... )阅读器宏,但是我假设宏参数未绑定在阅读器宏内使用。这是正确的吗?

因此,我的第二个想法是尝试生成一个包含阅读器宏的语句,但是我不确定是否有办法做到这一点。

关于扩展宏调用时生成XML文件的任何建议吗?

预先感谢您的任何想法。


"阅读器宏"和"宏"是完全不同的野兽,用于做非常不同的事情。

"阅读器宏"通常是一个函数。它们绑定到一个(或两个特定的序列)字符,并更改了读取源代码的方式。它们与代码无关,而与对象创建有关。

对于"阅读器宏",没有什么"宏参数"的明显定义(除了可能导致首先调用阅读器宏的字符序列之外,这很有用)例如,当您阅读列表时,将()匹配)。


类似的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(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)))))

编辑:要回答您的原始问题,通常不能(引用)引用阅读器宏。它们是在读取语法的地方执行的,我们称之为读取时间。阅读器宏不参与正常的宏扩展,而是在宏扩展之前起作用。

您可能会创建一个读取器宏,知道它在反引号读取器宏中被调用以与之一起使用,但是这将需要知道或更改反引号读取器宏的与实现相关的行为。

但是,您可以从阅读器宏中返回带引号的表格。