0

我想制作一个宏,当在类定义中使用时会创建一个字段,它是公共设置器和注释。但是,宏似乎没有扩展,主要是因为它在其他(类定义)宏中使用。

这是一个如何定义一个具有一个字段的类的示例:

(define-simple-class test-class ()
    (foo :: java.util.List ))

我的宏(目前仅定义字段):

(define-syntax autowire
  (syntax-rules ()
    ((autowire class id) 
            (id :: class))))

但是,如果我尝试使用它:

(define-simple-class test-class ()
    (autowire java.util.List foo))

并通过反射查询新类的字段,我可以看到它创建了一个名为 的字段autowire,并且foo无处可见。看起来像宏扩展顺序的问题。

4

1 回答 1

1

是的,宏是“从外向内”扩展的。展开后define-simple-class,子窗体(autowire java.util.List foo)不再存在。

如果你想要这种行为修改,你需要定义你自己的define-not-so-simple-class宏,它可能会扩展为一个define-simple-class表单。

但是,在对标准的东西进行如此细微的调整之前,请退后一步,问问自己这是否值得。优点可能是语法与您的思维方式更一致,但缺点是它可能更符合其他人的思维方式(他们可能需要理解您的代码)。可维护和可读的编码有一个格言:“传统”。

于 2018-08-25T22:23:24.870 回答