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

Can we change language syntax programmatically?

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

map.put(key, value);

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

map['key'] = value

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

在 Java 中,您不能。很少有语言允许自定义语法。例如,Perl 具有“pragmas”,它们基本上是其他 Perl 代码,可在脚本运行前对其进行预处理。很厉害也很恐怖。

如果您需要与 Java 兼容,但喜欢漂亮的语法,我会建议改用 Kotlin,它(如 C++ 和 Python)允许 operator overloading.

Java 的语法不能在运行时或编译时更改,甚至不支持运算符重载(+ 运算符重载为 String 除外。请参阅: How does the String class override the + operator?).

您可以在其他 JVM 语言(例如 Scala Groovy and Kotlin 中重载符号运算符(例如 -+/),但这是预定义的语法糖,并且语法本身仍然没有改变。

少数允许在运行时更改语法的语言之一是 Raku, slangs can be added to its grammar at runtime. An example of practical application of this feature is Slang::SQL,它使 SQL 成为主要语法的一部分。

可能 编写一个在编译器看到源代码之前查看源代码的程序,并将 map['key'] = value 转换为 map.put(key, value);。但这可能比花在这上面的工作更多。这甚至还没有融入到构建系统中。


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

Object[] map = new Object[10];

map[KEY] = value;

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

public static final int KEY = 0;

Hashmaps/Dictionaries 在幕后做一些类似的事情。