引用一个读者宏调用

时间:2012-11-02 02:03:17

标签: macros lisp common-lisp

有没有办法引用读者宏的调用?更具体地说,我想创建一个宏,一旦评估,将生成一个defclass语句和一个相应的XML文件。这可能吗?

我考虑过使用#.( ... )个阅读器宏,但我认为宏参数没有绑定在阅读器宏中使用。这是对的吗?

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

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

提前感谢任何想法。

2 个答案:

答案 0 :(得分:4)

“读者宏”和“宏”是完全不同的野兽,用来做很多不同的事情。

“读者宏”通常是一个功能,一开始。它们与一个(或两个特定序列)字符绑定,并改变源代码的读取方式。它们不是关于代码,而是关于对象创建。

对于“读者宏”,没有明确定义“宏参数”的含义(除此之外,可能来自导致读取器宏首先被调用的字符序列,非常有用)例如,当您阅读列表时,将()匹配。

答案 1 :(得分:1)

有些事情:

(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)))))

编辑:要回答您的原始问题,您通常(返回)引用读者宏。它们在读取语法的地方执行,让它称之为读取时间。读者宏不参与正常的宏观扩张,他们在宏观扩张前采取行动。

你可能会创建一个读取器宏,它知道它在反引号读取器宏中被调用以与它一起玩,但它需要知道或改变反引号读取器宏的依赖于实现的行为。

但是,您可以从读者宏中返回反引号的表单。