2014-06-19 3 views
0

입력 된 수학 문자열을 구문 분석하고 싶습니다. 다트 (three.dart 포함)에서 어떻게해야합니까? 요컨대Dart에서 입력 문자열을 어떻게 파싱합니까?

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에서와 같이 간단하지 않다"여기

는 JS (three.js를) 버전 당신의 필요에 따라 문자열 표현을 파싱 할 수 있기를 원합니다.

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

하지만 자바 스크립트에서는 'eval()'과 같은 함수를 사용하고 문자열을 코드로 쉽게 변환 할 수 있기 때문에 가능합니다.

Dart에는 이러한 종류의 기능이 없습니다. 상황은 Java의 경우와 같습니다.

당신은 2 선택이 있습니다

자신의 수학 파서를 구축 -> 그것은 멋진 아니지만, 당신은 단지 약간의 물건을 필요로하는 경우이 작업을 수행 할

사용 JS 가능 -> 또 다른 해결책은 함수를 생성하기 위해 자바 스크립트를 사용하지만 다트로 실행하는 것입니다. 여기에 예 :

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; }"; 

먼저 내가 사용자 입력을 시뮬레이션하는 기능라는 이름의 변수를 생성, 그것은 전화 또는 사용자 입력을받을 수있는 다른 것으로 교체해야합니다. 중요 사항 : 저는 javascript 변수에 저장하는 javascript 함수를 만듭니다. 그러면 f라는 전역 자바 스크립트 심볼이 만들어집니다.

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

여기 나는 이전에 생성 한 문자열을 동적으로 평가하는 javascript 함수 "eval"을 호출합니다. 이 작업이 끝나면 내 전역 JS 컨텍스트에는 함수 저장소가있는 f라는 변수가 포함됩니다.

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

내 함수가 생성되는 것보다 알고 난 그것에 액세스 할 수있는, 내 2 개 매개 변수, F 내 함수 매장 호출 (Y, X = 5 = 2) 나는 결과를 표시.

참고 : 귀하의 기능을 저장하는 JS 변수의 이름은 다음과 같습니다. 사용하지 않은 이름을 사용하십시오.

+0

첫 번째 줄은 입력 문자열의 예입니다. 사용자 입력으로 대체 할 수 있습니다 – Vink

+0

감사합니다. 코드가 어떻게 작동하는지 설명해 주시겠습니까? – user3699912

+1

나는 대답에 내 코드를 설명했다 :) (방금 편집) – Vink

관련 문제