https://www.reddit.com/r/Kotlin/comments/7hoytl/kotlin_team_ama_ask_us_anything/dqt56nv/
传统的宏很难在工具中得到很好的支持
在Java中,我们已经拥有了Lombok @Data生成方法,几乎与宏相同。 https://projectlombok.org/features/Data
为什么宏在工具中难以支持?
答案 0 :(得分:2)
工具可能意味着很多不同的东西,从实现宏转换的二进制代码的低级别,到实现或使用宏的IDE的高级别,这正是abreslav所提到的。由于宏可以改变它们所包含的代码的含义,因此您可以开始问题,例如决定要向用户显示哪种类型的源代码。
想象一下,有一个宏用字符串为所有属性添加前缀,在标识符连接期间大写自然原始变量:
someclass {
prefix("longPrefix") {
val a: String = ""
}
fun bar() {
println("Look at $longPrefixA")
}
}
想象一下这个编译和工作,你很难回答设计决策,因为你在宏变换之前显示原始的源 ...但是看到它也不会有用代码在之后?此外,部分源代码依赖于正在运行的宏,这反过来意味着IDE在您键入时必须实际编译和运行代码以验证对$longPrefixA
的引用是否有效。在某种程度上,如果您首先编写宏,则需要编译器/ IDE的编译时间调试器,就像您拥有通常的运行时调试器一样。
当您考虑控制流宏时会出现更多麻烦,以及编译抽象语法树以非显而易见的方式进行修改的情况,这也是宏为隐藏造成不良声誉的原因之一该程序(虽然我认为主要来自我们的C文本预处理器有偏见的历史)。即使你看到内置宏支持的其他编程语言,他们的工具也往往是乏味的,从而使meme永久化。
答案 1 :(得分:0)
当IDE以正确的方式完成时,不难在IDE中支持宏。
关键是在IDE中使用相同的编译器来实现语义功能。