我们可以以编程方式更改语言语法吗?
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 在幕后做一些类似的事情。
在 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 在幕后做一些类似的事情。