我想创建一个宏,该宏在类定义中使用时会创建一个字段,公共设置程序和注释。但是,似乎该宏没有扩展,主要是因为在其他(类定义)宏中使用了该宏。
这是一个如何使用一个字段定义类的示例:
(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
却无处可见。看起来像是宏扩展顺序的问题。
答案 0 :(得分:1)
是的,宏是“从外向内”扩展的。展开define-simple-class
后,子表单(autowire java.util.List foo)
不再存在。
如果要进行这种行为修改,则需要定义自己的define-not-so-simple-class
宏,该宏可能会扩展为define-simple-class
形式。
但是,请先退一步,然后再对标准内容进行细微调整,然后问问自己是否值得。好的方面可能是与您的思维方式更好地相符的语法,但坏处是,其可能与其他人(可能需要了解您的代码)的思维方式相差较远。可维护且可读的编码有一个格言:“常规”。