Scheme (Kawa) - 如何在另一个宏中强制展开宏
Scheme (Kawa) - How to force macro expansion inside another macro
我想制作一个宏,当在 class 定义中使用时创建一个字段,它是 public setter 和一个注释。但是,宏似乎没有扩展,主要是因为它在其他(class 定义)宏中使用。
下面是一个如何用一个字段定义 class 的例子:
(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))
并通过反射查询新的class的字段,我可以看到它创建了一个名为autowire
的字段,而foo
是无处可见的。看起来像是宏展开顺序的问题。
是的,宏是“从外向内”展开的。扩展 define-simple-class
后,子表单 (autowire java.util.List foo)
不再存在。
如果您想要这种行为修改,您需要定义自己的 define-not-so-simple-class
宏,它可能会扩展为 define-simple-class
形式。
但是,在对标准的东西进行如此微小的调整之前,请退后一步,问问自己这是否值得。好处可能是语法更符合您的想法,但缺点是它可能更不符合其他人的想法(他们可能需要理解您的代码)。可维护性和可读性编码有一条格言:“保持常规”。
我想制作一个宏,当在 class 定义中使用时创建一个字段,它是 public setter 和一个注释。但是,宏似乎没有扩展,主要是因为它在其他(class 定义)宏中使用。
下面是一个如何用一个字段定义 class 的例子:
(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))
并通过反射查询新的class的字段,我可以看到它创建了一个名为autowire
的字段,而foo
是无处可见的。看起来像是宏展开顺序的问题。
是的,宏是“从外向内”展开的。扩展 define-simple-class
后,子表单 (autowire java.util.List foo)
不再存在。
如果您想要这种行为修改,您需要定义自己的 define-not-so-simple-class
宏,它可能会扩展为 define-simple-class
形式。
但是,在对标准的东西进行如此微小的调整之前,请退后一步,问问自己这是否值得。好处可能是语法更符合您的想法,但缺点是它可能更不符合其他人的想法(他们可能需要理解您的代码)。可维护性和可读性编码有一条格言:“保持常规”。