Как мне проанализировать входную строку в Dart?

#javascript #dart

#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:

короче говоря: «не так просто, как в JS»

Объяснение :

если я хорошо понимаю ваши потребности, вы хотите иметь возможность анализировать строковое выражение, например :

 String math_square_expr = "(x) => pow(x, 2)"
some_magic_func(math_squre_expr)(5) // return 25
  

но это возможно в javascript, потому что у вас есть некоторые функции, такие как ‘eval ()’ и другие, которые упрощают преобразование строки в код.

В Dart у вас нет такой функции. в этом случае ситуация больше похожа на Java.

У вас есть 2 варианта:

Создайте свой собственный математический анализатор -> это не круто, но если вам нужно совсем немного, это возможно

Используйте 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. Это создаст глобальный символ javascript с именем f .

 JsObject functionJs = context.callMethod("eval", [function]);
  

Здесь я вызываю функцию javascript «eval» для динамической оценки ранее созданной строки. после этой операции мой глобальный контекст JS будет содержать переменную с именем f, в которой хранится функция.

 print(context.callMethod("f", [5, 2]));
  

Зная, что моя функция создана, и я могу получить к ней доступ, я вызываю хранилище функций в f с моими 2 параметрами (x = 5, y = 2) и отображаю результат.

Примечание: будьте осторожны с именем переменной JS, в которой вы будете хранить свою функцию. возьмите неиспользуемое имя.

Комментарии:

1. Первая строка — это просто пример входной строки. Вы можете заменить ее пользовательским вводом

2. Я объяснил свой код в ответе 🙂 (только что отредактированный)

3. Большое вам спасибо. Что делает double.parse() в Dart? Я нашел это в документах, и мне было интересно, было ли это чем-то похожим на ‘eval’.

4. Кроме того, как мне использовать / получить доступ к переменным ‘x’ и ‘y’ из функции?

5. double.parse() преобразует входную строку в double . Это функция, которая использует ‘x’ и ‘y’, чтобы изменить поведение, вам нужно изменить ядро функции (‘return x * x y’ — это просто пример). здесь x = 5 и y = 2, поэтому, если вы хотите изменить, просто измените параметр pass на ‘context.callMethod («f», [x, y])’ вызов