Binding
This commit is contained in:
@@ -294,7 +294,7 @@ var
|
||||
lookback: Int64;
|
||||
begin
|
||||
// The target series must have been resolved by the binder.
|
||||
seriesVar := FScope.GetValue(Node.Series.Resolve);
|
||||
seriesVar := FScope[Node.Series.Resolve];
|
||||
itemValue := Node.Value.Accept(Self);
|
||||
lookback := -1;
|
||||
|
||||
@@ -345,7 +345,7 @@ end;
|
||||
function TEvaluatorVisitor.VisitAssignment(const Node: IAssignmentNode): TAstValue;
|
||||
begin
|
||||
Result := Node.Value.Accept(Self);
|
||||
FScope.AssignValue(Node.Identifier.Resolve, Result);
|
||||
FScope[Node.Identifier.Resolve] := Result;
|
||||
end;
|
||||
|
||||
function TEvaluatorVisitor.VisitConstant(const Node: IConstantNode): TAstValue;
|
||||
@@ -378,7 +378,7 @@ end;
|
||||
|
||||
function TEvaluatorVisitor.VisitIdentifier(const Node: IIdentifierNode): TAstValue;
|
||||
begin
|
||||
Result := FScope.GetValue(Node.Resolve)
|
||||
Result := FScope[Node.Resolve];
|
||||
end;
|
||||
|
||||
function TEvaluatorVisitor.VisitIndexer(const Node: IIndexerNode): TAstValue;
|
||||
@@ -475,7 +475,7 @@ begin
|
||||
else
|
||||
value := TAstValue.Void;
|
||||
|
||||
FScope.AssignValue(Node.Identifier.Resolve, value);
|
||||
FScope[Node.Identifier.Resolve] := value;
|
||||
|
||||
Result := value;
|
||||
end;
|
||||
@@ -491,7 +491,6 @@ var
|
||||
closure: IEvaluatorClosure;
|
||||
i: Integer;
|
||||
callScope: IExecutionScope;
|
||||
innerVisitor: IAstVisitor;
|
||||
descriptor: IScopeDescriptor;
|
||||
begin
|
||||
calleeValue := Node.Callee.Accept(Self);
|
||||
@@ -519,15 +518,20 @@ begin
|
||||
if not Assigned(descriptor) then
|
||||
raise EParserError.Create('Lambda has no scope descriptor. Did the binder run?');
|
||||
|
||||
var adr: TResolvedAddress;
|
||||
adr.ScopeDepth := 0;
|
||||
adr.SlotIndex := 0;
|
||||
|
||||
callScope := descriptor.Instantiate(closure.ClosureScope);
|
||||
callScope.SetValueByIndex(0, calleeValue);
|
||||
callScope[adr] := calleeValue;
|
||||
|
||||
for i := 0 to Node.Arguments.Count - 1 do
|
||||
callScope.SetValueByIndex(closure.Parameters[i].Resolve.SlotIndex, Node.Arguments[i].Accept(Self));
|
||||
begin
|
||||
adr.SlotIndex := closure.Parameters[i].Resolve.SlotIndex;
|
||||
callScope[adr] := Node.Arguments[i].Accept(Self);
|
||||
end;
|
||||
|
||||
// 3. Führe den Körper der Funktion im neuen Scope aus.
|
||||
innerVisitor := Self.CreateVisitorForScope(callScope);
|
||||
Result := closure.Body.Accept(innerVisitor);
|
||||
Result := closure.Body.Accept(CreateVisitorForScope(callScope));
|
||||
end
|
||||
else
|
||||
raise EArgumentException.Create('Unknown closure implementation type.');
|
||||
|
||||
Reference in New Issue
Block a user