Macros 方案(Kawa)-如何在另一个宏中强制宏扩展

Macros 方案(Kawa)-如何在另一个宏中强制宏扩展,macros,scheme,lisp,kawa,Macros,Scheme,Lisp,Kawa,我想制作一个宏,当在类定义中使用它时,会创建一个字段、一个公共setter和一个注释。然而,宏似乎没有扩展,主要是因为它在其他(类定义)宏中使用 下面是一个示例,说明如何使用一个字段定义类: (define-simple-class test-class () (foo :: java.util.List )) 我的宏(目前仅定义字段): 但是,如果我尝试使用它: (define-simple-class test-class () (autowire java.util.Li

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

下面是一个示例,说明如何使用一个字段定义类:

(define-simple-class test-class ()
    (foo :: java.util.List ))
我的宏(目前仅定义字段):

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

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

通过反射查询新类的字段,我可以看到它创建了一个名为
autowire
的字段,而
foo
则不见踪影。看起来像是宏展开顺序的问题。

是的,宏是“从外到内”展开的。展开
define simple class
后,子表单
(autowire java.util.List foo)
不再存在

如果需要这种行为修改,则需要定义自己的
define not some simple class
宏,该宏可能会扩展为
define simple class
形式


然而,在对标准的东西进行如此细微的调整之前,请后退一步,问问自己是否值得。好的方面可能是语法与您的思维方式更为一致,但坏的方面可能是语法与其他人的思维方式更为一致(他们可能需要理解您的代码)。对于可维护和可读的编码有一条格言:“保持常规”。

简而言之,没有简单的方法可以做到这一点?考虑到我选择lisp主要是因为承诺消除样板文件,这真是一个糟糕的选择
(define-simple-class test-class ()
    (autowire java.util.List foo))