added macro quoting nodes

This commit is contained in:
Michael Schimmel
2025-10-03 14:17:34 +02:00
parent fd97799b7b
commit bb0ecda6be
4 changed files with 273 additions and 19 deletions
+51 -1
View File
@@ -25,6 +25,9 @@ type
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue; virtual; abstract;
function VisitAssignment(const Node: IAssignmentNode): TDataValue; virtual; abstract;
function VisitMacroDefinition(const Node: IMacroDefinitionNode): TDataValue; virtual; abstract;
function VisitQuasiquote(const Node: IQuasiquoteNode): TDataValue; virtual; abstract;
function VisitUnquote(const Node: IUnquoteNode): TDataValue; virtual; abstract;
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue; virtual; abstract;
function VisitIndexer(const Node: IIndexerNode): TDataValue; virtual; abstract;
function VisitMemberAccess(const Node: IMemberAccessNode): TDataValue; virtual; abstract;
function VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue; virtual; abstract;
@@ -59,6 +62,9 @@ type
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue; override; final;
function VisitAssignment(const Node: IAssignmentNode): TDataValue; override; final;
function VisitMacroDefinition(const Node: IMacroDefinitionNode): TDataValue; override; final;
function VisitQuasiquote(const Node: IQuasiquoteNode): TDataValue; override; final;
function VisitUnquote(const Node: IUnquoteNode): TDataValue; override; final;
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue; override; final;
function VisitIndexer(const Node: IIndexerNode): TDataValue; override; final;
function VisitMemberAccess(const Node: IMemberAccessNode): TDataValue; override; final;
function VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue; override; final;
@@ -79,6 +85,9 @@ type
function TransformVariableDeclaration(const Node: IVariableDeclarationNode): IVariableDeclarationNode; virtual;
function TransformAssignment(const Node: IAssignmentNode): IAssignmentNode; virtual;
function TransformMacroDefinition(const Node: IMacroDefinitionNode): IMacroDefinitionNode; virtual;
function TransformQuasiquote(const Node: IQuasiquoteNode): IQuasiquoteNode; virtual;
function TransformUnquote(const Node: IUnquoteNode): IUnquoteNode; virtual;
function TransformUnquoteSplicing(const Node: IUnquoteSplicingNode): IUnquoteSplicingNode; virtual;
function TransformIndexer(const Node: IIndexerNode): IIndexerNode; virtual;
function TransformMemberAccess(const Node: IMemberAccessNode): IMemberAccessNode; virtual;
function TransformCreateSeries(const Node: ICreateSeriesNode): ICreateSeriesNode; virtual;
@@ -249,6 +258,33 @@ begin
Result := TAst.MacroDef(name, parameters, body);
end;
function TAstTransformer.TransformQuasiquote(const Node: IQuasiquoteNode): IQuasiquoteNode;
begin
var expr := Accept(Node.Expression).AsIntf<IAstNode>;
if expr = Node.Expression then
Result := Node
else
Result := TAst.Quasiquote(expr);
end;
function TAstTransformer.TransformUnquote(const Node: IUnquoteNode): IUnquoteNode;
begin
var expr := Accept(Node.Expression).AsIntf<IAstNode>;
if expr = Node.Expression then
Result := Node
else
Result := TAst.Unquote(expr);
end;
function TAstTransformer.TransformUnquoteSplicing(const Node: IUnquoteSplicingNode): IUnquoteSplicingNode;
begin
var expr := Accept(Node.Expression).AsIntf<IAstNode>;
if expr = Node.Expression then
Result := Node
else
Result := TAst.UnquoteSplicing(expr);
end;
function TAstTransformer.TransformIndexer(const Node: IIndexerNode): IIndexerNode;
begin
var base := Accept(Node.Base).AsIntf<IAstNode>;
@@ -377,10 +413,24 @@ end;
function TAstTransformer.VisitMacroDefinition(const Node: IMacroDefinitionNode): TDataValue;
begin
// Added visit method for macro definitions.
Result := TDataValue.FromIntf<IMacroDefinitionNode>(TransformMacroDefinition(Node));
end;
function TAstTransformer.VisitQuasiquote(const Node: IQuasiquoteNode): TDataValue;
begin
Result := TDataValue.FromIntf<IQuasiquoteNode>(TransformQuasiquote(Node));
end;
function TAstTransformer.VisitUnquote(const Node: IUnquoteNode): TDataValue;
begin
Result := TDataValue.FromIntf<IUnquoteNode>(TransformUnquote(Node));
end;
function TAstTransformer.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue;
begin
Result := TDataValue.FromIntf<IUnquoteSplicingNode>(TransformUnquoteSplicing(Node));
end;
function TAstTransformer.VisitIndexer(const Node: IIndexerNode): TDataValue;
begin
Result := TDataValue.FromIntf<IIndexerNode>(TransformIndexer(Node));