preparado para expresiones en los valores de entrada

This commit is contained in:
Álvaro González 2025-10-05 17:25:49 +02:00
parent daa8b31879
commit 5a8f9de2a1
4 changed files with 40 additions and 14 deletions

View file

@ -56,7 +56,9 @@ class _FormulaScreenState extends State<FormulaScreen> {
try {
final inputValues = <String, dynamic>{};
for (final input in widget.formula.input) {
final value = double.tryParse(_inputControllers[input.name]!.text) ?? 0.0;
final text = _inputControllers[input.name]!.text;
//final value = double.tryParse(text) ?? 0.0;
final value = FormulaEvaluator.evaluateExpression(text);
// Convert input to base unit if needed
// Always convert from dropdown unit to variable's base unit

View file

@ -21,34 +21,36 @@ class FormulaEvaluationException implements Exception {
}
class MyMath{
static Number log(Number x) => Math.log(x);
static Number pow(Number b, Number e) => Math.pow(b,e) as Number;
static Number myLog(Number x) => Math.log(x);
static Number myPow(Number b, Number e) => Math.pow(b,e) as Number;
}
class FormulaEvaluator {
final D4rt _interpreter;
FormulaEvaluator([D4rt? interpreter]) : _interpreter = interpreter ?? D4rt(){
static D4rt createDefaultInterpreter() => D4rt();
FormulaEvaluator([D4rt? interpreter]) : _interpreter = interpreter ?? createDefaultInterpreter(){
prepareInterpreter(_interpreter);
}
Number getNumberValueOf(String s){
static Number getNumberValueOf(String s){
return double.parse(s);
}
void prepareInterpreter(D4rt interpreter){
static void prepareInterpreter(D4rt interpreter){
final myMathDefinition = BridgedClass(
nativeType: MyMath,
name: 'Math',
name: 'MyMath',
staticMethods: {
'pow': (visitor, positionalArgs, namedArgs) {
'myPow': (visitor, positionalArgs, namedArgs) {
final Number base = getNumberValueOf( positionalArgs[0].toString() );
final Number exp = getNumberValueOf( positionalArgs[1].toString() );
return MyMath.pow(base,exp);
return MyMath.myPow(base,exp);
},
'log': (visitor, positionalArgs, namedArgs) {
'myLog': (visitor, positionalArgs, namedArgs) {
final Number x = getNumberValueOf( positionalArgs[0].toString() );
return MyMath.log(x);
return MyMath.myLog(x);
},
}
);
@ -56,6 +58,20 @@ class FormulaEvaluator {
interpreter.registerBridgedClass(myMathDefinition, "package:d4rt_formulas.dart");
}
static dynamic evaluateExpression(String code) {
final interpreter = createDefaultInterpreter();
prepareInterpreter(interpreter);
final d4rtCode = """
import 'dart:math';
import "package:d4rt_formulas.dart";
main()
{
return $code;
}""";
final result = interpreter.execute(source: d4rtCode);
return result.toDouble();
}
dynamic evaluate(Formula formula, Map<String, dynamic> inputValues) {
_validateInputValues(formula, inputValues);
@ -98,9 +114,8 @@ class FormulaEvaluator {
buffer.writeln("""
import 'dart:math';
import "package:d4rt_formulas.dart";
//log(x) => M.log(x);
//pow(a,b) => M.pow(a,b);
main()
{

View file

@ -102,7 +102,6 @@ class UnitSpec {
class VariableSpec {
final String name;
final String unit;
static final MAGNITUDELESS = "magnitudeless";
VariableSpec({required this.name, required this.unit});

10
test/dart_test.dart Normal file
View file

@ -0,0 +1,10 @@
import 'package:test/test.dart';
import 'package:d4rt/d4rt.dart';
import 'dart:math' as Math;
main(){
test('for dart grammar tests', () {
});
}