Scheme(Kawa)-如何在另一个宏内强制进行宏扩展

时间:2018-08-25 16:22:18

标签: macros scheme lisp kawa

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

这是一个如何使用一个字段定义类的示例:

(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却无处可见。看起来像是宏扩展顺序的问题。

1 个答案:

答案 0 :(得分:1)

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

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

但是,请先退一步,然后再对标准内容进行细微调整,然后问问自己是否值得。好的方面可能是与您的思维方式更好地相符的语法,但坏处是,其可能与其他人(可能需要了解您的代码)的思维方式相差较远。可维护且可读的编码有一个格言:“常规”。