【问题标题】:Can we change language syntax programmatically?我们可以以编程方式更改语言语法吗?
【发布时间】:2020-06-26 12:48:40
【问题描述】:

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

map.put(key, value);

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

map['key'] = value

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

【问题讨论】:

  • 不,你不能。 Java 不支持运算符重载等。
  • 请注意,运算符重载并不是实现这一目标的唯一方法。例如,Scala 具有语法结构,允许您简单地定义(在调用时)看起来类似于语言结构的方法。 (也许有人会说这只是运算符重载的一种极端形式,但我不会这样描述)。
  • 如果您使用的是 Java 9 或更高版本,您可以使用 Map 接口中的工厂方法 Map.of 来简化不可变映射的创建和初始化。示例:Map<String, String> map = Map.of("key1","value1", "key2", "value2");

标签: java syntax operator-overloading language-design


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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


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

      Object[] map = new Object[10];
      
      map[KEY] = value;
      

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

      public static final int KEY = 0;
      

      Hashmaps/Dictionaries 在底层做了类似的事情。

      【讨论】:

        猜你喜欢
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多