我们可以通过编程方式更改语言语法吗?

时间:2020-06-26 12:48:40

标签: java syntax operator-overloading language-design

在Java映射中,当我们需要插入一些值时,我们使用:

private val isFirebaseEnabled: Boolean
    get() {
        return try {
            FirebaseApp.getInstance() != null.   //that is always true, nevertheless it will throw exception if Firebase is not available
        } catch (e: IllegalStateException) {
            false
        }
    }

在其他语言(例如C ++映射或Python词典)中,我们可以使用方括号:

map.put(key, value);

此语法对于Java映射无效。我们可以通过编写一些代码或使用某些库以编程方式更改此语法吗?

3 个答案:

答案 0 :(得分:3)

在Java中,您不能。很少有允许自定义语法的语言。例如,Perl具有“ pragma”,它们基本上是其他Perl代码,可以在脚本运行之前对其进行预处理。它非常强大,但也很可怕。

如果您需要与Java兼容,但希望使用漂亮的语法,我建议您使用Kotlin,它(例如C ++和Python)允许operator overloading

答案 1 :(得分:1)

Java的语法无法在运行时或编译时更改,甚至不支持运算符重载(+的{​​{1}}运算符重载除外。请参见:How does the String class override the + operator?)。 / p>

您可以重载其他JVM语言(例如Scala Groovy和{{3})中的符号运算符(例如String-+) },但这是预定义的语法糖,语法本身仍保持不变。

Kotlin是允许在运行时更改语法的几种语言之一,Raku可以在运行时添加到其语法中。此功能的实际应用示例是slangs,它使SQL成为主要语法的一部分。

答案 2 :(得分:1)

有可能写一个程序在编译器看到源代码之前查看您的源代码,然后将map['key'] = value转换为map.put(key, value);。但这可能比花在此上的事情还要有意义。甚至连集成到构建系统中都没有。


更严重的是,如果您提前知道所有键(我认为您可能是因为使用了字符串文字),则可以通过使用数组来获得非常相似的语法:

Object[] map = new Object[10];

map[KEY] = value;

其中key是一个整数常量,例如

public static final int KEY = 0;

哈希图/字典在后台执行类似的操作。