gpt4 book ai didi

delphi - 如何使用 ICompiledBinding 计算包含 `Pi` 常量的表达式?

转载 作者:行者123 更新时间:2023-12-03 15:50:38 28 4
gpt4 key购买 nike

我正在使用 ICompiledBinding 接口(interface)来计算简单表达式,如果我使用像 (2*5)+10 这样的文字,效果很好,但是当我尝试编译时类似 2*Pi 的代码失败并出现错误:

EEvaluatorError:Couldn't find Pi

这是我当前的代码

{$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.

那么如何使用 ICompiledBinding 接口(interface)计算包含 Pi 常量的表达式?

最佳答案

据我所知存在两种选择

1) 您可以初始化IScope使用 TNestedScope 类传递 BasicOperatorsBasicConstants 范围的接口(interface)。

(BasicConstants 作用域定义 nil、true、False 和 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) 您可以使用这样的句子手动将 Pi 值添加到范围。

TDictionaryScope(RootScope).Map.Add('Pi', TValueWrapper.Create(pi));

代码将如下所示

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;

关于delphi - 如何使用 ICompiledBinding 计算包含 `Pi` 常量的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11336047/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com