algorithm - 为什么人们说 Java 不能有表达式求值器?

标签 algorithm language-agnostic reflection java

我知道默认情况下 Java 没有所谓的 eval(我发音为“evil”)方法。这听起来像是一件坏事——知道你没有很多其他人拥有的东西。但更糟糕的是,似乎被告知您不能拥有它。

我的问题是:它背后的可靠推理是什么?我的意思是,谷歌搜索只会返回大量旧数据和虚假原因——即使有我正在寻找的答案,我也无法从那些只是乱扔通用标记词的人那里过滤掉它。

我对告诉我如何解决这个问题的答案不感兴趣;我可以自己做:

使用 Bean 脚本框架 (BSF)

文件sample.py(在py文件夹中)内容:

def factorial(n): 
    return reduce(lambda x, y:x * y, range(1, n + 1))

和 Java 代码:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("jython");
engine.eval(new FileReader("py" + java.io.File.separator + "sample.py"));
System.out.println(engine.eval("factorial(932)"));

使用像 JLink 这样的设计桥

example

这相当于:

String expr = "N[Integrate[E^(2 y^5)/(2 x^3), {x, 4, 7}, {y, 2, 3}]]";
System.out.println(MM.Eval(expr));
//Output: 1.5187560850359461*^206 + 4.2210685420287355*^190*I

其他方法

  • 使用 Dijkstras 调车场算法或类似算法并从头开始编写表达式计算器。
  • 通过委托(delegate)和 HashMultimaps 使用复杂的正则表达式和字符串操作。
  • 使用 Java 表达式库
  • 使用 Java 表达式语言
  • 使用 BeanShell 等符合 JRE 标准的脚本语言。
  • 使用 Java 汇编器和下面的方法或直接字节码操作,如 Javaassist。
  • 使用 Java Compiler API 和反射。
  • 以根用户身份使用 Runtime.getRuntime().exec

最佳答案

“eval”仅在脚本语言中可用,因为它使用运行其余代码的相同解释器;在此类语言中,该功能是免费的且集成良好,因为在脚本环境中,运行字符串或“真实”函数几乎没有区别。

在编译语言中,添加“eval”意味着捆绑整个编译器——这违背了编译的目的。我所知道的编译语言(即使是动态语言,如 ActionScrip3)都没有 eval。

顺便说一句,在 Java 中求值的最简单方法是您忘记提及的方法:JRE 1.6 带有 Javascript 引擎,因此您可以在两行代码中求值任何 Javascript。你甚至可以争辩说你的问题的前提是错误的。 Java 1.6 捆绑了一个非常先进的表达式计算器

关于algorithm - 为什么人们说 Java 不能有表达式求值器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5285306/

相关文章:

reflection - 反射(reflect): How to get the name of a struct field?

.net - 从 .Net 程序集检索目标框架版本和目标框架配置文件

language-agnostic - 调用层次结构的最大深度

algorithm - 是否有一种有效的方法可以按特定顺序迭代未排序的容器,而无需排序/复制/引用原始容器?

algorithm - 从字典中查找字谜的最有效算法是什么?

algorithm - 并行遍历的树设计

language-agnostic - 当 write 或 read 返回的请求少于请求时如何调用它?

java - 如何检查 "multi-object"返回类型

algorithm - 任何渲染多个实体切割平面的方法?

algorithm - 在范围系列中找到最频繁重复的整数