我正在尝试使用 DWScript 创建一个读取-评估-打印循环 (REPL),但我不确定这是否可行。
根据名称,我认为RecompileInContext
在这种情况下可以正常工作,但我遇到了一些限制:
- 程序中永远包含有错误的行:将来的运行将始终由于该行而失败
- 我没有找到一种方法来简单地通过键入来输出变量的值。例如,当键入
var test = "content";
then时test
,content
应显示。据我所知,使用print
或println
无法工作,因为它们将在每次运行时执行
所以我的问题是:是否可以使用 DWScript 创建 REPL ?
这是我到目前为止所得到的:
program DwsRepl;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
dwsComp,
dwsCompiler,
dwsExprs;
var
oCompiler: TDelphiWebScript;
oProgram: IdwsProgram;
oExecution: IdwsProgramExecution;
sInput: string;
begin
try
oCompiler := TDelphiWebScript.Create(nil);
try
oProgram := oCompiler.Compile('', 'ReplScript');
oExecution := oProgram.BeginNewExecution;
try
while True do
begin
Write('> ');
// Read user input
Readln(sInput);
// Exit if needed
if sInput = '' then Break;
// Compile
oCompiler.RecompileInContext(oProgram, sInput);
if not oProgram.Msgs.HasErrors then
begin
oExecution.RunProgram(0);
// Output
if not oExecution.Msgs.HasErrors then
Writeln(oExecution.Result.ToString)
else
Writeln('EXECUTION ERROR: ' + oExecution.Msgs.AsInfo);
end
else
Writeln('COMPILE ERROR: ' + oProgram.Msgs.AsInfo);
end;
finally
oExecution.EndProgram;
end;
finally
oCompiler.Free();
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.