I'm using the ICompiledBinding interface to evaluate simple expressions, If I use literals like (2*5)+10 works fine , but when i try to compile something like 2*Pi the code fails with the error :
EEvaluatorError:Couldn't find Pi
This is my current code
{$APPTYPE CONSOLE}
uses
System.Rtti,
System.Bindings.EvalProtocol,
System.Bindings.EvalSys,
System.Bindings.Evaluator,
System.SysUtils;
procedure Test;
Var
RootScope : IScope;
CompiledExpr : ICompiledBinding;
R : TValue;
begin
RootScope:= BasicOperators;
//Compile('(2*5)+10', RootScope); //works
CompiledExpr:= Compile('2*Pi', RootScope);//fails
R:=CompiledExpr.Evaluate(RootScope, nil, nil).GetValue;
if not R.IsEmpty then
Writeln(R.ToString);
end;
begin
try
Test;
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
So how I can evaluate an expression which contains the Pi constant using the ICompiledBinding interface?
As far i know exists two options
1) You can initializate the IScope interface using the TNestedScope class passing the BasicOperators and BasicConstants scopes.
(The BasicConstants Scope define nil, true, False, and Pi.)
Var
RootScope : IScope;
CompiledExpr : ICompiledBinding;
R : TValue;
begin
RootScope:= TNestedScope.Create(BasicOperators, BasicConstants);
CompiledExpr:= Compile('2*Pi', RootScope);
R:=CompiledExpr.Evaluate(RootScope, nil, nil).GetValue;
if not R.IsEmpty then
Writeln(R.ToString);
end;
2) you can add the Pi Value manually to the Scope using a sentence like this.
TDictionaryScope(RootScope).Map.Add('Pi', TValueWrapper.Create(pi));
and the code will look like this
Var
RootScope : IScope;
CompiledExpr : ICompiledBinding;
R : TValue;
begin
RootScope:= BasicOperators;
TDictionaryScope(RootScope).Map.Add('Pi', TValueWrapper.Create(pi));
CompiledExpr:= Compile('2*Pi', RootScope);
R:=CompiledExpr.Evaluate(RootScope, nil, nil).GetValue;
if not R.IsEmpty then
Writeln(R.ToString);
end;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With