AST function purity analysis

This commit is contained in:
Michael Schimmel
2025-11-22 14:49:24 +01:00
parent 61b6a1742b
commit 240f794211
17 changed files with 429 additions and 68 deletions
+16 -8
View File
@@ -110,7 +110,7 @@ type
procedure RTLListViewChange(Sender: TObject);
private
FCurrUnboundAst: IAstNode;
FCurrExec: TDataValue.TFunc;
FCurrExec: TCompiledFunction;
FEnvironment: TAstEnvironment;
FWorkspace: TAuraWorkspace;
FScriptUpdate: Boolean;
@@ -262,7 +262,7 @@ end;
function TForm1.ExecuteAst(const ANode: IAstNode): TDataValue;
begin
FCurrUnboundAst := ANode;
FCurrExec := nil; // Clear previous
FCurrExec := Default(TCompiledFunction);
// 1. Set strategy based on UI
if DebugBox.IsChecked then
@@ -273,12 +273,21 @@ begin
try
// Wrap in Lambda to compile
var funcDef := TAst.LambdaExpr([], ANode);
FCurrExec := FEnvironment.Compile(funcDef).Func;
Result := FCurrExec([]);
FCurrExec := FEnvironment.Compile(funcDef);
if Assigned(FCurrExec.Func) then
begin
Memo1.Lines.Add(
Format('Compiled. Signature: %s, IsPure=%s', [FCurrExec.StaticType.ToString, BoolToStr(FCurrExec.IsPure, true)])
);
end;
Result := FCurrExec.Func([]);
except
on E: Exception do
begin
FCurrExec.Func := nil;
Memo1.Lines.Add('--- ERROR ---');
Memo1.Lines.Add(E.ClassName + ': ' + E.Message);
Result := TDataValue.Void;
@@ -645,7 +654,7 @@ begin
FCurrUnboundAst := converter.Deserialize(jsonObj);
// Run the full pipeline via environment
FCurrExec := FEnvironment.Compile(FCurrUnboundAst).Func;
FCurrExec := FEnvironment.Compile(FCurrUnboundAst);
Memo1.Lines.Add('AST deserialized and bound successfully from JSON.');
Memo1.Lines.Add('You can now visualize it (Middle Mouse Click) or pretty-print it.');
@@ -655,7 +664,6 @@ begin
except
on E: Exception do
begin
FCurrExec := nil;
Memo1.Lines.Add('Error deserializing AST from JSON:');
Memo1.Lines.Add(E.Message);
Memo1.Lines.Add('--- Original JSON ---');
@@ -675,7 +683,7 @@ var
begin
Memo1.Lines.Clear;
if not Assigned(FCurrExec) then
if not Assigned(FCurrExec.Func) then
begin
Memo1.Lines.Add('No AST available to serialize. Please generate one first.');
exit;
@@ -703,7 +711,7 @@ begin
Memo1.Lines.Clear;
Memo1.Lines.Add('--- AST Dump ---');
if not Assigned(FCurrExec) then
if not Assigned(FCurrExec.Func) then
begin
Memo1.Lines.Add('No *compiled* AST has been generated yet. Click a test button first.');
exit;