宏工具支持

时间:2017-12-08 10:24:11

标签: java macros kotlin lombok scala-macros

https://www.reddit.com/r/Kotlin/comments/7hoytl/kotlin_team_ama_ask_us_anything/dqt56nv/

  

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

在Java中,我们已经拥有了Lombok @Data生成方法,几乎​​与宏相同。 https://projectlombok.org/features/Data

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

2 个答案:

答案 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中使用相同的编译器来实现语义功能。