我想要创建一个宏,在类定义中使用这个宏可以创建一个字段、一个公共设置器和一个注释。但是,宏似乎没有扩展,主要是因为它在其他宏(类定义)中使用。
下面是一个示例,说明如何用一个字段定义类:
(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在任何地方都看不到。看起来是宏展开顺序的一个问题。
发布于 2018-08-25 22:23:24
是的,宏是从外部展开的。扩展define-simple-class后,子表单(autowire java.util.List foo)不再存在。
如果您希望进行这种行为修改,则需要定义自己的define-not-so-simple-class宏,该宏可能展开为define-simple-class窗体。
然而,在对一些标准的东西做如此小的调整之前,请退后一步,问问自己这是否值得。它的优点可能是与您的想法稍微一致的语法,但缺点是它可能与其他人的想法(可能需要理解您的代码)的方式更差。对于可维护和可读的编码,有一条格言:“保持常规”。
https://stackoverflow.com/questions/52019144
复制相似问题