Java 工具中的宏支持

Java 工具中的宏支持,java,macros,kotlin,lombok,scala-macros,Java,Macros,Kotlin,Lombok,Scala Macros,传统的宏很难在工具中得到很好的支持 在Java中,我们已经有了Lombok@Data what生成方法,几乎与宏相同。 为什么在工具中很难支持宏?工具可能意味着许多不同的东西,从实现宏转换的二进制代码的低级到实现或使用宏的IDE的高级,这就是abreslav所提到的。由于宏可以改变它们所包含的代码的含义,因此您开始遇到一些问题,例如决定要向用户显示哪种源代码 想象一下,有一个宏在所有属性前面加上一个字符串,在连接标识符时自然地将原始变量大写: someclass { prefix("l

传统的宏很难在工具中得到很好的支持

在Java中,我们已经有了Lombok@Data what生成方法,几乎与宏相同。


为什么在工具中很难支持宏?

工具可能意味着许多不同的东西,从实现宏转换的二进制代码的低级到实现或使用宏的IDE的高级,这就是abreslav所提到的。由于宏可以改变它们所包含的代码的含义,因此您开始遇到一些问题,例如决定要向用户显示哪种源代码

想象一下,有一个宏在所有属性前面加上一个字符串,在连接标识符时自然地将原始变量大写:

someclass {
    prefix("longPrefix") {
        val a: String = ""
    }

    fun bar() {
        println("Look at $longPrefixA")
    }
}
想象一下,这已经编译并运行了,您很难回答设计决策,因为您在宏转换之前显示了原始源代码……但是在宏转换之后查看代码不是很有用吗?此外,部分源代码取决于正在运行的宏,这反过来意味着IDE必须在您键入时编译并运行代码,以验证对
$longprifixa
的引用是否有效。在某种程度上,如果您首先编写宏,那么编译器/IDE需要一个编译时调试器,就像运行时需要一个常用调试器一样


当您考虑控制流宏时,会遇到更多的问题,例如编译抽象语法树以不明显的方式被修改,这也是宏因隐藏程序而名声不佳的原因之一(尽管我认为这主要来自于我们的C文本预处理器偏向历史)。即使当你看其他具有内置宏支持的编程语言时,它们的工具也往往是不起眼的,在某种程度上延续了模因。

如果宏操作正确,在IDE中也不难支持


关键是对IDE中的语义功能使用相同的编译器。

这是错误的。宏和IDE支持本身并没有什么问题。@Axel,当然,请参阅Common Lisp with Slime。或者喷气式飞机。