패키지, 저장소 및 앱 카테고리 검색

패키지 상세v0.9.1

function_tree

문자열을 호출 가능한 함수 트리로 변환하는 간단한 라이브러리입니다.

AndroidiOSWebmacOSWindowsLinux
30일 다운로드
1.2만
좋아요
78
Pub 점수
150

패키지 설치

flutter pub add function_tree

패키지 개요

공개 정보를 바탕으로 생성한 선택 가이드입니다.

FunctionTree는 수식 문자열을 실행 가능한 함수 트리로 파싱할 수 있는 가벼운 Dart 라이브러리입니다. 기본 산술 연산, 변수 및 사용자 정의 함수를 지원하며, 구조화된 호출 가능한 연산으로 변환하여 안전하게 식을 평가합니다. 계산기, 과학 도구 또는 데이터 처리 인터페이스와 같이 사용자 정의 계산이 필요한 앱에서 동적 공식 평가에 이상적입니다. 이 라이브러리는 플랫폼에 관계없이 작동하며, Android, iOS, Web, macOS, Windows, Linux에서 모두 사용 가능합니다.

사용 사례

  • 동적 수식 평가
  • 계산기 애플리케이션
  • 과학 계산
  • 데이터 변환 스크립트
  • 사용자 정의 표현식 파싱

주요 기능

  • 문자열에서 함수로의 트리 파싱
  • 안전한 표현 평가
  • 변수 및 사용자 정의 함수 지원
  • 크로스 플랫폼 호환성
  • 최소의 런타임 오버헤드

적합한 대상

  • 계산이 많은 앱 기능
  • 인터랙티브 계산기
  • 사용자 정의 가능한 데이터 처리
  • 교육 도구
  • 백엔드 표현 엔진

고려 사항

  • 복잡한 수학 라이브러리(예: 삼각함수)를 기본적으로 지원하지 않습니다
  • 주입 위험을 방지하기 위해 신중한 입력 검증이 필요합니다
  • 추가 설정 없이 기본 산술에 국한
  • 고빈도 반복 평가에 최적화되지 않음
  • 내장된 오류 복구 또는 세부 진단 없음

원본 README

연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.

Function Tree

Welcome to function_tree, a simple library for parsing strings into callable function-trees.

Parsing strings as mathematical expressions

At the simplest (and least efficient) level, we can interpret strings as mathematical expressions:

final expressions = [
  "2 + 2",
  "(3 + 2)^3",
  "3 * pi / 4",
  "3 * sin(5 * pi / 6)",
  "e^(-1)"
];
for (final expression in expressions) {
  print("'$expression' -> ${expression.interpret()}");
}

'2 + 2' -> 4.0
'(3 + 2)^3' -> 125.0
'3 * pi / 4' -> 2.356194490192345
'3 * sin(5 * pi / 6)' -> 1.5000000000000009
'e^(-1)' -> 0.36787944117144233

Function Trees

The library supports two types of callable, function-trees, namely SingleVariableFunction and MultiVariableFunction.

Single variable functions

We can create a single variable function from a string either by constructing a SingleVariableFunction instance or by calling the toSingleVariableFunction string extension directly on a string, as in the following example.

final f = "20 * (sin(x) + 1)".toSingleVariableFunction(),
    pi = "pi".interpret();
for (var x = 0.0; x < 2 * pi; x += pi / 20) {
  print("|" + " " * f(x).round() + "*");
}

|                    *
|                       *
|                          *
|                             *
|                                *
|                                  *
|                                    *
|                                      *
|                                       *
|                                        *
|                                        *
|                                        *
|                                       *
|                                      *
|                                    *
|                                  *
|                                *
|                             *
|                          *
|                       *
|                    *
|                 *
|              *
|           *
|        *
|      *
|    *
|  *
| *
|*
|*
|*
| *
|  *
|    *
|      *
|        *
|           *
|              *
|                 *
Multi-variable functions

Similarly, we can construct a MultiVariableFunction instance or call the toMultiVariableFunction string extension to create a multi-variable function tree, as in the following example.

final times = "a * b".toMultiVariableFunction(["a", "b"]),
    values = [1, 2, 3, 4, 5];
for (final a in values) {
  final sb = StringBuffer();
  for (final b in values) {
    sb
      ..write(times({"a": a, "b": b}).floor())
      ..write("\t");
  }
  print(sb);
}

1	2	3	4	5	
2	4	6	8	10	
3	6	9	12	15	
4	8	12	16	20	
5	10	15	20	25	

TeX expressions

Function tree instances have a tex property for TeX expressions:

final f = "x * cos(y) + y * sin(x)".toMultiVariableFunction(["x", "y"]);
print(f.tex);

x cdot \cos\left( y \right) + y cdot \sin\left( x \right)

Derivatives

Derivative trees can be constructed through the SingleVariableFunction.derivative and MultiVariableFunction.partial methods.

final f = "(2 * x) ^ (1 / (x ^ 2))".toSingleVariableFunction(), 
    fDash = f.derivative("x");
print("x      y      y'");
for (var x = 0.5; x < 3.0; x += 0.25) {
  print(
    "${x.toStringAsFixed(4)} "
    "${f(x).toStringAsFixed(4)} "
    "${fDash(x).toStringAsFixed(4)}");
}
x      y      y'
0.5000 1.0000 8.0000
0.7500 2.0561 0.9215
1.0000 2.0000 -0.7726
1.2500 1.7976 -0.7663
1.5000 1.6295 -0.5780
1.7500 1.5054 -0.4229
2.0000 1.4142 -0.3134
2.2500 1.3460 -0.2373
2.5000 1.2937 -0.1837
2.7500 1.2529 -0.1452
final f = "sin(u ^ 2 + 2 * v)".toMultiVariableFunction(["u", "v"]), 
  fu = f.partial("u"), 
  fv = f.partial("v"),
  pi = "pi".interpret(),
  u = pi / 3,
  v = pi / 4;
  for (final fun in [f, fu, fv]) {
    print("${fun({"u": u, "v": v})}");
  }
0.4566033934365143
-1.8633212348878314
-1.779340710602958

Interpreter

The interpreter has support for the following:

Functions
One-parameter functions
abs     acos    asin    atan    ceil
cos     cosh    cot     coth    csc
csch    exp     fact    floor   ln      
log     round   sec     sech    sin
sinh    sqrt    tan     tanh
Two-parameter functions
log     nrt     pow
Constants
e       pi      ln2     ln10    log2e
log10e  sqrt1_2 sqrt2
Operations
+  -  *  /  %  ^

Thanks

Thanks for your interest in this library. Please file any bugs or requests here.

카테고리

소스 저장소

이 패키지를 사용하는 프로젝트