我想解析一个输入数学字符串。我如何在Dart(使用three.dart)中执行此操作?
这是js(three.js)版本:
zFunc = Parser.parse(zFuncText).toJSFunction( ['x','y'] );
meshFunction = function(x, y)
{
x = xRange * x + xMin;
y = yRange * y + yMin;
var z = zFunc(x,y); //= Math.cos(x) * Math.sqrt(y);
if ( isNaN(z) )
return new THREE.Vector3(0,0,0); // TODO: better fix
else
return new THREE.Vector3(x, y, z);
};
答案 0 :(得分:1)
简而言之:“并不像JS中那么简单”
说明:
如果我理解你的需要,你希望能够解析字符串表达式,如:
String math_square_expr = "(x) => pow(x, 2)"
some_magic_func(math_squre_expr)(5) // return 25
但它可以在javascript中使用,因为你有一些像'eval()'这样的功能,以及其他易于将字符串转换为代码的东西。
在Dart中,你没有这种功能。对于这种情况,情况更像是Java。
您有两个选择:
构建自己的数学解析器 - >它并不酷,但如果你只需要很少的东西就可以了
使用Js完成工作 - >另一个解决方案是使用Javascript来创建函数,但是用dart执行。这里有一个例子:
import 'dart:js';
void main() {
String function = "var f = function(x, y) { return x*x + y; }";
JsObject functionJs = context.callMethod("eval", [function]);
print(functionJs);
print(context.callMethod("f", [5, 2]));
}
解释:
String function = "var f = function(x, y) { return x*x + y; }";
首先我创建一个名为function的变量来模拟用户输入,它需要被一个调用或其他东西替换才能获得用户输入。 重要的是:我创建了一个javascript函数,我存储在一个javascript变量中。这将创建一个名为f。
的全局JavaScript符号JsObject functionJs = context.callMethod("eval", [function]);
这里我调用javascript函数“eval”来动态评估先前创建的字符串。在这个操作之后,我的全局JS上下文将包含一个名为f的变量,其中包含一个函数存储。
print(context.callMethod("f", [5, 2]));
知道我的功能已经创建并且我可以访问它,我在f中使用我的2个参数(x = 5,y = 2)调用我的函数存储,然后显示结果。
注意: 因为您将存储函数的JS变量的命名。拿一个未使用的名字。