如何在Dart中解析输入字符串?

时间:2014-06-19 20:42:55

标签: javascript dart

我想解析一个输入数学字符串。我如何在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);
    };

1 个答案:

答案 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变量的命名。拿一个未使用的名字。