From 60952494c1188c9fc25a61332e6b64a7771a56d0 Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Tue, 6 Jan 2026 18:02:05 +0100 Subject: [PATCH] Json Schema for LLMs --- ASTPlayground/ASTPlayground.delphilsp.json | 2 +- Src/AST/Myc.Ast.Json.Schema.pas | 287 ++-- Src/AST/Myc.Ast.Nodes.pas | 1597 ++++++++++---------- Src/AST/Myc.Ast.RTL.Core.pas | 114 +- 4 files changed, 1061 insertions(+), 939 deletions(-) diff --git a/ASTPlayground/ASTPlayground.delphilsp.json b/ASTPlayground/ASTPlayground.delphilsp.json index 82cef08..d90215c 100644 --- a/ASTPlayground/ASTPlayground.delphilsp.json +++ b/ASTPlayground/ASTPlayground.delphilsp.json @@ -1 +1 @@ -{ "settings": { "project": "file:///T%3A/Myc/ASTPlayground/ASTPlayground.dpr", "dllname": "dcc64370.dll", "dccOptions": "-$O- -$W+ --inline:off -$R+ -$Q+ --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;;FRAMEWORK_FMX -E.\\Win64\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Bpl\\Win64 -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NU.\\Win64\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;System;Xml;Data;Datasnap;Web;Soap; -OT:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -R\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -U\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -V -VN -VR -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\hpp\\Win64 -NO.\\Win64\\Debug -LU" , "projectFiles":[ { "name": "MainForm", "file": "file:///T%3A/Myc/ASTPlayground/MainForm.pas" }, { "name": "Myc.Ast.Nodes", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Nodes.pas" }, { "name": "Myc.Ast.Scope", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Scope.pas" }, { "name": "Myc.Data.Value", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Data.Value.pas" }, { "name": "Myc.Ast.Visitor", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Visitor.pas" }, { "name": "Myc.Ast.RTL", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.pas" }, { "name": "Myc.Ast.Dumper", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Dumper.pas" }, { "name": "Myc.Ast.RTL.Core", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Core.pas" }, { "name": "Myc.Utils", "file": "file:///T%3A/Myc/Src/Myc.Utils.pas" }, { "name": "Myc.Ast.Script", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.pas" }, { "name": "Myc.Ast.Types", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Types.pas" }, { "name": "Myc.Data.Keyword", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Keyword.pas" }, { "name": "Myc.Ast.Compiler.TCO", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TCO.pas" }, { "name": "Myc.Ast.Compiler.Binder", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Binder.pas" }, { "name": "Myc.Ast.Compiler.Lowering", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Lowering.pas" }, { "name": "Myc.Ast.Compiler.TypeChecker", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TypeChecker.pas" }, { "name": "Myc.Ast.Compiler.Macros", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Macros.pas" }, { "name": "Myc.Ast.Compiler.Specializer", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Specializer.pas" }, { "name": "Myc.Ast.Environment", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Environment.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Analysis.Purity", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Analysis.Purity.pas" }, { "name": "Myc.Ast.Identities", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Identities.pas" }, { "name": "Myc.Fmx.AstEditor.Visualizer", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Layout", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Layout.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Ast.Refactoring.Remove", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Refactoring.Remove.pas" }, { "name": "Myc.Fmx.AstEditor.Render", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Render.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Lists", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Primitives", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Control", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Data", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas" }, { "name": "Myc.Ast.RTL.TypeRegistry", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.TypeRegistry.pas" }, { "name": "Myc.Trade.Broker", "file": "file:///T%3A/Myc/Src/Myc.Trade.Broker.pas" }, { "name": "Myc.Data.Stream.Pipes", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.Pipes.pas" }, { "name": "Myc.Data.Stream", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Pipes", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Pipes.pas" }, { "name": "Demo.Finance", "file": "file:///T%3A/Myc/Test/Demo.Finance.pas" }, { "name": "Myc.Ast.Script.Print", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.Print.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": true, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/FlatBox2D","file:///C%3A/Users/Public/Documents/Embarcadero/Studio/37.0/Dcp/%25PLATFORM%25","file:///%25TP%25/runtime/vcl","file:///S%3A/sc_famos_src/svn_vcl/cpxedits","file:///S%3A/sc_famos_src/svn_vcl/dzChart","file:///S%3A/sc_famos_src/svn_vcl/eaeditor","file:///S%3A/sc_famos_src/svn_vcl/FamosEvents","file:///S%3A/sc_famos_src/svn_vcl/HTML_Viewer/source","file:///S%3A/sc_famos_src/svn_vcl/Myc_ChartEdit","file:///S%3A/sc_famos_src/svn_vcl/Myc_HemiDrag","file:///S%3A/sc_famos_src/svn_vcl/Myc_SplitControl","file:///S%3A/sc_famos_src/svn_vcl/NiceChart","file:///S%3A/sc_famos_src/svn_vcl/plotter","file:///S%3A/sc_famos_src/svn_vcl/SimpleIPC","file:///S%3A/sc_famos_src/svn_vcl/SynEdit-master/Source","file:///S%3A/sc_famos_src/svn_vcl/ValEdits","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib/win32","file:///S%3A/sc_famos_src/svn_vcl/Virtual-TreeView/Source","file:///S%3A/sc_famos_src/svn_common/caHelpSys","file:///S%3A/sc_famos_src/svn_common/Misc","file:///S%3A/sc_famos_src/svn_common/Myc_VecMath","file:///S%3A/sc_famos_src/svn_common/PascalScript/source","file:///S%3A/sc_famos_src/svn_common/TreeBase","file:///S%3A/sc_famos_src/svn_common/TreeBase/Medien","file:///S%3A/3rdParty/spring4d/Source","file:///S%3A/3rdParty/spring4d/Source/Base","file:///S%3A/3rdParty/spring4d/Source/Base/Collections","file:///S%3A/3rdParty/spring4d/Source/Base/Logging","file:///S%3A/3rdParty/spring4d/Source/Base/Patches","file:///S%3A/3rdParty/spring4d/Source/Core/Container","file:///S%3A/3rdParty/spring4d/Source/Core/Interception","file:///S%3A/3rdParty/spring4d/Source/Core/Logging","file:///S%3A/3rdParty/spring4d/Source/Core/Mocking","file:///S%3A/3rdParty/spring4d/Source/Core/Services","file:///S%3A/3rdParty/spring4d/Source/Extensions/Cryptography","file:///S%3A/3rdParty/spring4d/Source/Extensions/Utils","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCommon%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressGDI%2B%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLibrary/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/XP%20Theme%20Manager/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLayout%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressPageControl/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressEditors%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDocking%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressBars/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressOfficeCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressMemData/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDataController/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressNavBar/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressSkins%20Library/Sources","file:///T%3A/Myc/Src","file:///T%3A/Myc/Src/Data","file:///T%3A/Myc/Src/AST" ] , "CommonAppData": "file:///C%3A/Users/Brummel/AppData/Roaming/Embarcadero/BDS/37.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/ObjRepos/" } } \ No newline at end of file +{ "settings": { "project": "file:///T%3A/Myc/ASTPlayground/ASTPlayground.dpr", "dllname": "dcc64370.dll", "dccOptions": "-$O- -$W+ --inline:off -$R+ -$Q+ --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;;FRAMEWORK_FMX -E.\\Win64\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Bpl\\Win64 -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NU.\\Win64\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;System;Xml;Data;Datasnap;Web;Soap; -OT:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -R\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -U\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -V -VN -VR -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\hpp\\Win64 -NO.\\Win64\\Debug -LU" , "projectFiles":[ { "name": "MainForm", "file": "file:///T%3A/Myc/ASTPlayground/MainForm.pas" }, { "name": "Myc.Ast.Nodes", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Nodes.pas" }, { "name": "Myc.Ast.Scope", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Scope.pas" }, { "name": "Myc.Data.Value", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Data.Value.pas" }, { "name": "Myc.Ast.Visitor", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Visitor.pas" }, { "name": "Myc.Ast.RTL", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.pas" }, { "name": "Myc.Ast.Dumper", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Dumper.pas" }, { "name": "Myc.Ast.RTL.Core", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Core.pas" }, { "name": "Myc.Utils", "file": "file:///T%3A/Myc/Src/Myc.Utils.pas" }, { "name": "Myc.Ast.Script", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.pas" }, { "name": "Myc.Ast.Types", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Types.pas" }, { "name": "Myc.Data.Keyword", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Keyword.pas" }, { "name": "Myc.Ast.Compiler.TCO", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TCO.pas" }, { "name": "Myc.Ast.Compiler.Binder", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Binder.pas" }, { "name": "Myc.Ast.Compiler.Lowering", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Lowering.pas" }, { "name": "Myc.Ast.Compiler.TypeChecker", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TypeChecker.pas" }, { "name": "Myc.Ast.Compiler.Macros", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Macros.pas" }, { "name": "Myc.Ast.Compiler.Specializer", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Specializer.pas" }, { "name": "Myc.Ast.Environment", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Environment.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Analysis.Purity", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Analysis.Purity.pas" }, { "name": "Myc.Ast.Identities", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Identities.pas" }, { "name": "Myc.Fmx.AstEditor.Visualizer", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Layout", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Layout.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Ast.Refactoring.Remove", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Refactoring.Remove.pas" }, { "name": "Myc.Fmx.AstEditor.Render", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Render.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Lists", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Primitives", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Control", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Data", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas" }, { "name": "Myc.Ast.RTL.TypeRegistry", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.TypeRegistry.pas" }, { "name": "Myc.Trade.Broker", "file": "file:///T%3A/Myc/Src/Myc.Trade.Broker.pas" }, { "name": "Myc.Data.Stream.Pipes", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.Pipes.pas" }, { "name": "Myc.Data.Stream", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Pipes", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Pipes.pas" }, { "name": "Demo.Finance", "file": "file:///T%3A/Myc/Test/Demo.Finance.pas" }, { "name": "Myc.Ast.Script.Print", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.Print.pas" }, { "name": "Myc.Ast.Json.Schema", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Json.Schema.pas" }, { "name": "Myc.Ast.Attributes", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Ast.Attributes.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": true, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/FlatBox2D","file:///C%3A/Users/Public/Documents/Embarcadero/Studio/37.0/Dcp/%25PLATFORM%25","file:///%25TP%25/runtime/vcl","file:///S%3A/sc_famos_src/svn_vcl/cpxedits","file:///S%3A/sc_famos_src/svn_vcl/dzChart","file:///S%3A/sc_famos_src/svn_vcl/eaeditor","file:///S%3A/sc_famos_src/svn_vcl/FamosEvents","file:///S%3A/sc_famos_src/svn_vcl/HTML_Viewer/source","file:///S%3A/sc_famos_src/svn_vcl/Myc_ChartEdit","file:///S%3A/sc_famos_src/svn_vcl/Myc_HemiDrag","file:///S%3A/sc_famos_src/svn_vcl/Myc_SplitControl","file:///S%3A/sc_famos_src/svn_vcl/NiceChart","file:///S%3A/sc_famos_src/svn_vcl/plotter","file:///S%3A/sc_famos_src/svn_vcl/SimpleIPC","file:///S%3A/sc_famos_src/svn_vcl/SynEdit-master/Source","file:///S%3A/sc_famos_src/svn_vcl/ValEdits","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib/win32","file:///S%3A/sc_famos_src/svn_vcl/Virtual-TreeView/Source","file:///S%3A/sc_famos_src/svn_common/caHelpSys","file:///S%3A/sc_famos_src/svn_common/Misc","file:///S%3A/sc_famos_src/svn_common/Myc_VecMath","file:///S%3A/sc_famos_src/svn_common/PascalScript/source","file:///S%3A/sc_famos_src/svn_common/TreeBase","file:///S%3A/sc_famos_src/svn_common/TreeBase/Medien","file:///S%3A/3rdParty/spring4d/Source","file:///S%3A/3rdParty/spring4d/Source/Base","file:///S%3A/3rdParty/spring4d/Source/Base/Collections","file:///S%3A/3rdParty/spring4d/Source/Base/Logging","file:///S%3A/3rdParty/spring4d/Source/Base/Patches","file:///S%3A/3rdParty/spring4d/Source/Core/Container","file:///S%3A/3rdParty/spring4d/Source/Core/Interception","file:///S%3A/3rdParty/spring4d/Source/Core/Logging","file:///S%3A/3rdParty/spring4d/Source/Core/Mocking","file:///S%3A/3rdParty/spring4d/Source/Core/Services","file:///S%3A/3rdParty/spring4d/Source/Extensions/Cryptography","file:///S%3A/3rdParty/spring4d/Source/Extensions/Utils","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCommon%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressGDI%2B%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLibrary/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/XP%20Theme%20Manager/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLayout%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressPageControl/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressEditors%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDocking%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressBars/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressOfficeCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressMemData/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDataController/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressNavBar/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressSkins%20Library/Sources","file:///T%3A/Myc/Src","file:///T%3A/Myc/Src/Data","file:///T%3A/Myc/Src/AST" ] , "CommonAppData": "file:///C%3A/Users/Brummel/AppData/Roaming/Embarcadero/BDS/37.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/ObjRepos/" } } \ No newline at end of file diff --git a/Src/AST/Myc.Ast.Json.Schema.pas b/Src/AST/Myc.Ast.Json.Schema.pas index a0c23f5..05c05af 100644 --- a/Src/AST/Myc.Ast.Json.Schema.pas +++ b/Src/AST/Myc.Ast.Json.Schema.pas @@ -3,129 +3,144 @@ interface uses - System.SysUtils, - System.Classes, - System.Generics.Collections, - System.Generics.Defaults, - System.Rtti, - System.TypInfo, + system.sysutils, + system.classes, + system.generics.collections, + system.generics.defaults, + system.rtti, + system.typinfo, Myc.Ast.Nodes, - Myc.Ast.Attributes; + Myc.Ast.Attributes, + Myc.Ast.RTL, + Myc.Ast.RTL.Core; type + { Scans AST and RTL metadata to generate a high-precision LLM system prompt. } TAstSchema = class + strict private + type + TFieldInfo = record + Idx: Integer; + Name: string; + Kind: TFieldKind; + end; + + class function GetTsType(Kind: TFieldKind): string; static; public - // Generates the TypeScript definition by scanning INTERFACES via RTTI - class function GenerateTypeScriptDefinition: string; + // Generates the TypeScript definition including JSDoc and multiple @example entries + class function GenerateTypeScriptDefinition: string; static; - // Static rules for the format - class function GenerateGenerationRules: string; + // Generates documented RTL function signatures with all overloads + class function GenerateRtlDocumentation: string; static; - // Combined prompt - class function GenerateFullSystemPrompt: string; + // Detailed generation rules to eliminate ambiguity + class function GenerateGenerationRules: string; static; + + // The final consolidated system prompt + class function GenerateFullSystemPrompt: string; static; end; implementation -type - // Helper structure to collect fields per type - TFieldInfo = record - Idx: Integer; - Def: string; - end; - { TAstSchema } +class function TAstSchema.GetTsType(Kind: TFieldKind): string; +begin + case Kind of + fkNode: Result := 'AstNode'; + fkTuple: Result := 'Tuple'; + fkString: Result := 'string'; + fkValue: Result := 'number | string | boolean'; + fkNullableNode: Result := 'AstNode | null'; + fkArrayOfPairs: Result := 'Array<[AstNode, AstNode]>'; + else + Result := 'any'; + end; +end; + class function TAstSchema.GenerateTypeScriptDefinition: string; var ctx: TRttiContext; - types: TArray; typ: TRttiType; - prop: TRttiProperty; attr: TCustomAttribute; - fieldAttr: AstFieldAttribute; nodeDefs: TDictionary>; + nodeDocs: TDictionary; + nodeExamples: TDictionary>; unionTypes: TList; - fieldsList: TList; sb: TStringBuilder; - tag: string; - fieldInfo: TFieldInfo; + tag, doc: string; + fieldList: TList; + exampleList: TList; i: Integer; - - function GetTsType(Kind: TFieldKind): string; - begin - case Kind of - fkNode: Result := 'AstNode'; - fkTuple: Result := 'Tuple'; - fkString: Result := 'string'; - fkValue: Result := 'number | string | boolean'; - fkNullableNode: Result := 'AstNode | null'; - fkArrayOfPairs: Result := 'Array<[AstNode, AstNode]>'; - else - Result := 'any'; - end; - end; - begin ctx := TRttiContext.Create; nodeDefs := TDictionary>.Create; + nodeDocs := TDictionary.Create; + nodeExamples := TDictionary>.Create; unionTypes := TList.Create; sb := TStringBuilder.Create; - try - // 1. Scan all types (looking for INTERFACES now) - types := ctx.GetTypes; - - for typ in types do + for typ in ctx.GetTypes do begin - // CHANGE: We now look for Interfaces, not Classes if typ.TypeKind <> tkInterface then - Continue; + continue; - // Check for [AstTag] attribute on the interface tag := ''; + doc := ''; + fieldList := nil; + exampleList := nil; + for attr in typ.GetAttributes do + begin if attr is AstTagAttribute then - begin tag := AstTagAttribute(attr).Tag; - Break; + + if attr is AstDocAttribute then + doc := AstDocAttribute(attr).Description; + + if attr is AstExampleAttribute then + begin + if exampleList = nil then + exampleList := TList.Create; + exampleList.Add(AstExampleAttribute(attr).Example); end; - if tag = '' then - Continue; - - if not nodeDefs.ContainsKey(tag) then - begin - nodeDefs.Add(tag, TList.Create); - unionTypes.Add(tag); + if attr is AstFieldAttribute then + begin + if fieldList = nil then + fieldList := TList.Create; + var f: TFieldInfo; + f.Idx := AstFieldAttribute(attr).Index; + f.Name := AstFieldAttribute(attr).Name; + f.Kind := AstFieldAttribute(attr).Kind; + fieldList.Add(f); + end; end; - fieldsList := nodeDefs[tag]; - - // CHANGE: Scan Properties of the interface - for prop in typ.GetProperties do + if tag <> '' then begin - for attr in prop.GetAttributes do - if attr is AstFieldAttribute then - begin - fieldAttr := AstFieldAttribute(attr); - - fieldInfo.Idx := fieldAttr.Index; - fieldInfo.Def := GetTsType(fieldAttr.Kind) + ' /*' + fieldAttr.Name + '*/'; - - fieldsList.Add(fieldInfo); - end; + unionTypes.Add(tag); + if doc <> '' then + nodeDocs.Add(tag, doc); + if exampleList <> nil then + nodeExamples.Add(tag, exampleList); + if fieldList = nil then + fieldList := TList.Create; + nodeDefs.Add(tag, fieldList); + end + else + begin + fieldList.Free; + exampleList.Free; end; end; - // 2. Build the output - sb.AppendLine('// AST Schema Definition (Auto-Generated via RTTI from Interfaces)'); + sb.AppendLine('// AST Schema Definition (Auto-Generated)'); sb.AppendLine('// Format: Compact JSON Arrays [Tag, Arg1, Arg2, ...]'); sb.AppendLine; unionTypes.Sort; - // Union Type Definition sb.AppendLine('type AstNode = '); for i := 0 to unionTypes.Count - 1 do begin @@ -136,63 +151,131 @@ begin sb.AppendLine(';'); sb.AppendLine; - // Special Handling for Tuple (it's recursive array structure) + sb.AppendLine('/** Explicit list structure */'); sb.AppendLine('type Tuple = ["Tuple", AstNode[]];'); sb.AppendLine; - // Node Definitions for tag in unionTypes do begin - // Skip Tuple in automatic generation as we defined it manually above - // to represent the array structure correctly in TypeScript if tag = 'Tuple' then - Continue; + continue; - fieldsList := nodeDefs[tag]; + sb.Append('/** '); + if nodeDocs.TryGetValue(tag, doc) then + sb.Append(doc); - // Sort fields by Index to ensure correct JSON array order - fieldsList.Sort(TComparer.Construct(function(const L, R: TFieldInfo): Integer begin Result := L.Idx - R.Idx; end)); + if nodeExamples.TryGetValue(tag, exampleList) then + begin + for var ex in exampleList do + sb.Append(sLineBreak + ' @example ' + ex); + end; + sb.AppendLine(' */'); + + fieldList := nodeDefs[tag]; + fieldList.Sort(TComparer.Construct(function(const L, R: TFieldInfo): Integer begin Result := L.Idx - R.Idx; end)); sb.Append('type ' + tag + ' = ["' + tag + '"'); - - for fieldInfo in fieldsList do - sb.Append(', ' + fieldInfo.Def); - + for var f in fieldList do + sb.Append(Format(', %s /* %s */', [GetTsType(f.Kind), f.Name])); sb.AppendLine('];'); end; Result := sb.ToString; - finally - // Clean up lists in dictionary - for tag in nodeDefs.Keys do - nodeDefs[tag].Free; - + for fieldList in nodeDefs.Values do + fieldList.Free; + for exampleList in nodeExamples.Values do + exampleList.Free; nodeDefs.Free; + nodeDocs.Free; + nodeExamples.Free; unionTypes.Free; sb.Free; ctx.Free; end; end; +class function TAstSchema.GenerateRtlDocumentation: string; +var + ctx: TRttiContext; + typ: TRttiType; + meth: TRttiMethod; + attr: TCustomAttribute; + doc, rtlName: string; + sigs: TList; + sb: TStringBuilder; + processedNames: THashSet; +begin + ctx := TRttiContext.Create; + sb := TStringBuilder.Create; + sigs := TList.Create; + processedNames := THashSet.Create; + try + typ := ctx.GetType(TypeInfo(TRtlFunctions)); + sb.AppendLine('### 3. Runtime Library (Available Functions)'); + sb.AppendLine; + + for meth in typ.GetMethods do + begin + doc := ''; + rtlName := ''; + sigs.Clear; + + for attr in meth.GetAttributes do + begin + if attr is AstDocAttribute then + doc := AstDocAttribute(attr).Description; + if attr is TRtlExportAttribute then + rtlName := TRtlExportAttribute(attr).Name; + if attr is AstSignatureAttribute then + sigs.Add(AstSignatureAttribute(attr).Signature); + end; + + if (rtlName <> '') and (not processedNames.Contains(rtlName)) then + begin + sb.Append(Format('- `%s`', [rtlName])); + if sigs.Count > 0 then + sb.Append(': ' + string.Join(' | ', sigs.ToArray)); + if doc <> '' then + sb.Append(' — ' + doc); + sb.AppendLine; + processedNames.Add(rtlName); + end; + end; + Result := sb.ToString; + finally + processedNames.Free; + sigs.Free; + sb.Free; + ctx.Free; + end; +end; + class function TAstSchema.GenerateGenerationRules: string; var sb: TStringBuilder; begin - // These rules describe the PROTOCOL (Compact Arrays), not the content. - // They remain static unless you change TJsonAstConverter logic significantly. sb := TStringBuilder.Create; try sb.AppendLine('**⚠️ CRITICAL GENERATION RULES:**'); sb.AppendLine; - sb.AppendLine('1. **NO JSON OBJECTS:** Do not use `{ "key": "value" }`. Every node MUST be a JSON Array `["Tag", Arg1, Arg2]`.'); + sb.AppendLine('1. **NO JSON OBJECTS:** Do not use `{}`. Every node MUST be a JSON Array `["Tag", Arg1, Arg2]`.'); + sb.AppendLine('2. **EXPLICIT TUPLES:** Fields defined as `Tuple` MUST be wrapped in `["Tuple", [...]]`.'); + sb.AppendLine('3. **EXPLICIT NULLS:** Optional fields (`| null`) MUST be explicit `null` if not present.'); + sb.AppendLine('4. **STRICT ORDER:** Array elements must follow the schema index exactly. Never swap arguments.'); sb.AppendLine( - '2. **EXPLICIT TUPLES:** Whenever a field in the schema is defined as `Tuple`, you MUST wrap the list in a `["Tuple", [...]]` node.' + '5. **OPERATORS:** Use `Call` with an `Id` for operators: `["Call", ["Id", "+"], ["Tuple", [["Const", 1], ["Const", 2]]]]`.' ); sb.AppendLine( - '3. **EXPLICIT NULLS:** Optional fields (marked as `| null`) MUST be explicit `null` if not present. Do not omit them.' + '6. **ID VS KEY:** Use `Key` for record keys (e.g. `["Field", ["Key", "p"], ...]`). Use `Id` for variables, functions, and operators.' ); - sb.AppendLine('4. **STRICT ORDER:** The order of elements in the array is fixed defined by the schema. Never swap arguments.'); + sb.AppendLine('7. **BOOLEANS:** The literals `true` and `false` are identifiers: `["Id", "true"]` or `["Id", "false"]`.'); + sb.AppendLine( + '8. **SCALAR TYPES:** Valid types for series definitions are: `:Ordinal`, `:Float`, `:Boolean`, `:Text`, `:DateTime`.' + ); + sb.AppendLine('9. **NESTED ARRAYS:** In "Cond", the pairs are an array of arrays: `[ [cond1, branch1], [cond2, branch2] ]`.'); + sb.AppendLine('10. **RECURSION:** Use `Recur` for tail-recursive calls to enable optimization.'); + sb.AppendLine('11. **NO COMMENTS:** Output raw JSON only. No explanations.'); Result := sb.ToString; finally @@ -202,9 +285,8 @@ end; class function TAstSchema.GenerateFullSystemPrompt: string; begin - // Combine everything Result := - 'You are a compiler frontend for a scripting language.' + 'You are a compiler frontend for a domain-specific scripting language.' + sLineBreak + 'Your task is to generate a valid Abstract Syntax Tree (AST) in a specific Compact JSON format.' + sLineBreak @@ -215,8 +297,9 @@ begin + sLineBreak + '### 2. Constraints & Rules' + sLineBreak - + GenerateGenerationRules; - //TODO add 3. RTL + + GenerateGenerationRules + + sLineBreak + + GenerateRtlDocumentation; end; end. diff --git a/Src/AST/Myc.Ast.Nodes.pas b/Src/AST/Myc.Ast.Nodes.pas index 74da128..c3a1483 100644 --- a/Src/AST/Myc.Ast.Nodes.pas +++ b/Src/AST/Myc.Ast.Nodes.pas @@ -1,10 +1,12 @@ unit Myc.Ast.Nodes; +{$M+} // Enable RTTI for all interfaces and enums + interface uses - System.SysUtils, - System.Generics.Collections, + system.sysutils, + system.generics.collections, Myc.Data.Scalar, Myc.Data.Value, Myc.Data.Keyword, @@ -78,7 +80,6 @@ type IAstVisitor = interface; IAstTypedNode = interface; - // Forward Declarations of specific nodes IConstantNode = interface; IIdentifierNode = interface; IKeywordNode = interface; @@ -106,15 +107,12 @@ type INopNode = interface; IPipeNode = interface; - // Node Kinds & Helpers TAstNodeKind = ( akConstant, akIdentifier, akKeyword, - // Containers akTuple, akRecordField, - // Control Flow akIfExpression, akCondExpression, akLambdaExpression, @@ -135,7 +133,6 @@ type akSeriesLength, akRecur, akNop, - // Pipes akPipe ); @@ -150,8 +147,6 @@ type constructor Create(const ACondition, ABranch: IAstNode); end; - // --- Base Interfaces --- - IAstNode = interface {$region 'private'} function GetKind: TAstNodeKind; @@ -160,16 +155,12 @@ type {$endregion} function Accept(const Visitor: IAstVisitor): TDataValue; - // Fluent Casts / Accessors (Interface based) function AsTypedNode: IAstTypedNode; - function AsConstant: IConstantNode; function AsIdentifier: IIdentifierNode; function AsKeyword: IKeywordNode; - function AsTuple: ITupleNode; function AsRecordField: IRecordFieldNode; - function AsIfExpression: IIfExpressionNode; function AsCondExpression: ICondExpressionNode; function AsLambdaExpression: ILambdaExpressionNode; @@ -190,7 +181,6 @@ type function AsSeriesLength: ISeriesLengthNode; function AsRecur: IRecurNode; function AsNop: INopNode; - function AsPipe: IPipeNode; property IsTyped: Boolean read GetIsTyped; @@ -205,21 +195,6 @@ type property StaticType: IStaticType read GetStaticType; end; - [AstTag('Field')] - IRecordFieldNode = interface(IAstNode) - {$region 'private'} - function GetKey: IKeywordNode; - function GetValue: IAstNode; - {$endregion} - [AstField(0, 'key', fkNode)] - property Key: IKeywordNode read GetKey; - - [AstField(1, 'value', fkNode)] - property Value: IAstNode read GetValue; - end; - - // --- Node Interfaces (Definitions) --- - IFunctionDefinition = interface(IAstTypedNode) {$region 'private'} function GetBody: IAstNode; @@ -231,80 +206,141 @@ type property IsPure: Boolean read GetIsPure; end; + // --- Specialized Node Interfaces with Examples and Docs --- + [AstTag('Nop')] + [AstDoc('A placeholder that performs no action.')] + [AstExample('["Nop"]')] INopNode = interface(IAstTypedNode) end; [AstTag('Const')] + [AstDoc('A literal value (number, string, or boolean).')] + [AstExample('["Const", 42]')] + [AstExample('["Const", "Myc"]')] + [AstField(0, 'value', fkValue)] IConstantNode = interface(IAstTypedNode) {$region 'private'} function GetValue: TDataValue; {$endregion} - [AstField(0, 'value', fkValue)] property Value: TDataValue read GetValue; end; [AstTag('Id')] + [AstDoc('A name referring to a variable, parameter or function.')] + [AstExample('["Id", "x"]')] + [AstField(0, 'name', fkString)] IIdentifierNode = interface(IAstTypedNode) {$region 'private'} function GetAddress: TResolvedAddress; function GetName: string; {$endregion} property Address: TResolvedAddress read GetAddress; - - [AstField(0, 'name', fkString)] property Name: string read GetName; end; [AstTag('Key')] + [AstDoc('An interned keyword literal.')] + [AstExample('["Key", "volume"]')] + [AstField(0, 'name', fkString)] IKeywordNode = interface(IAstTypedNode) {$region 'private'} function GetValue: IKeyword; {$endregion} - [AstField(0, 'name', fkString)] property Value: IKeyword read GetValue; end; [AstTag('Tuple')] + [AstDoc('A positional collection of elements (Vector).')] + [AstExample('["Tuple", [["Const", 1], ["Id", "y"]]]')] + [AstField(0, 'elements', fkNode)] ITupleNode = interface(IAstTypedNode) {$region 'private'} function GetElements: TArray; {$endregion} - [AstField(0, 'elements', fkNode)] property Elements: TArray read GetElements; end; + [AstTag('Field')] + [AstDoc('A single entry in a record literal.')] + [AstField(0, 'key', fkNode)] + [AstField(1, 'value', fkNode)] + IRecordFieldNode = interface(IAstNode) + {$region 'private'} + function GetKey: IKeywordNode; + function GetValue: IAstNode; + {$endregion} + property Key: IKeywordNode read GetKey; + property Value: IAstNode read GetValue; + end; + [AstTag('If')] + [AstDoc('Conditional ternary expression.')] + [ + AstExample( + ''' + ["If", + ["Call", ["Id", ">"], ["Tuple", [["Id", "x"], ["Const", 0]]]], + ["Const", "ok"], + ["Const", "fail"] + ] + ''' + ) + ] + [AstField(0, 'cond', fkNode)] + [AstField(1, 'then', fkNode)] + [AstField(2, 'else', fkNullableNode)] IIfExpressionNode = interface(IAstTypedNode) {$region 'private'} function GetCondition: IAstNode; function GetThenBranch: IAstNode; function GetElseBranch: IAstNode; {$endregion} - [AstField(0, 'cond', fkNode)] property Condition: IAstNode read GetCondition; - - [AstField(1, 'then', fkNode)] property ThenBranch: IAstNode read GetThenBranch; - - [AstField(2, 'else', fkNullableNode)] property ElseBranch: IAstNode read GetElseBranch; end; [AstTag('Cond')] + [AstDoc('Multi-branch condition. Pairs are [ [cond, branch], ... ].')] + [ + AstExample( + ''' + ["Cond", + [ + [["Call", ["Id", "="], ["Tuple", [["Id", "s"], ["Const", 1]]]], ["Key", "up"]], + [["Call", ["Id", "="], ["Tuple", [["Id", "s"], ["Const", 2]]]], ["Key", "down"]] + ], + ["Key", "flat"] + ] + ''' + ) + ] + [AstField(0, 'pairs', fkArrayOfPairs)] + [AstField(1, 'else', fkNullableNode)] ICondExpressionNode = interface(IAstTypedNode) {$region 'private'} function GetPairs: TArray; function GetElseBranch: IAstNode; {$endregion} - [AstField(0, 'pairs', fkArrayOfPairs)] property Pairs: TArray read GetPairs; - - [AstField(1, 'else', fkNullableNode)] property ElseBranch: IAstNode read GetElseBranch; end; [AstTag('Fn')] + [AstDoc('Anonymous function definition (lambda).')] + [ + AstExample( + ''' + ["Fn", + ["Tuple", [["Id", "a"], ["Id", "b"]]], + ["Call", ["Id", "+"], ["Tuple", [["Id", "a"], ["Id", "b"]]]] + ] + ''' + ) + ] + [AstField(0, 'params', fkTuple)] + [AstField(1, 'body', fkNode)] ILambdaExpressionNode = interface(IFunctionDefinition) {$region 'private'} function GetLayout: IScopeLayout; @@ -316,16 +352,13 @@ type property Descriptor: IScopeDescriptor read GetDescriptor; property Upvalues: TArray read GetUpvalues; property HasNestedLambdas: Boolean read GetHasNestedLambdas; - - // Annotated properties from base interface (for schema generation) - [AstField(0, 'params', fkTuple)] - property Parameters: ITupleNode read GetParameters; - - [AstField(1, 'body', fkNode)] - property Body: IAstNode read GetBody; end; [AstTag('Call')] + [AstDoc('Function or operator invocation.')] + [AstExample('["Call", ["Id", "abs"], ["Tuple", [["Const", -5]]]]')] + [AstField(0, 'callee', fkNode)] + [AstField(1, 'args', fkTuple)] IFunctionCallNode = interface(IAstTypedNode) {$region 'private'} function GetCallee: IAstNode; @@ -334,17 +367,254 @@ type function GetStaticTarget: TDataValue.TFunc; function GetIsTargetPure: Boolean; {$endregion} - [AstField(0, 'callee', fkNode)] property Callee: IAstNode read GetCallee; - - [AstField(1, 'args', fkTuple)] property Arguments: ITupleNode read GetArguments; - property IsTailCall: Boolean read GetIsTailCall; property StaticTarget: TDataValue.TFunc read GetStaticTarget; property IsTargetPure: Boolean read GetIsTargetPure; end; + [AstTag('Block')] + [AstDoc('Sequential execution of nodes.')] + [ + AstExample( + ''' + ["Block", ["Tuple", [ + ["Var", ["Id", "a"], ["Const", 1]], + ["Assign", ["Id", "a"], ["Call", ["Id", "+"], ["Tuple", [["Id", "a"], ["Const", 1]]]]], + ["Id", "a"] + ]]] + ''' + ) + ] + [AstField(0, 'expressions', fkTuple)] + IBlockExpressionNode = interface(IAstTypedNode) + {$region 'private'} + function GetExpressions: ITupleNode; + {$endregion} + property Expressions: ITupleNode read GetExpressions; + end; + + [AstTag('Var')] + [AstDoc('Variable declaration.')] + [AstExample('["Var", ["Id", "val"], ["Const", 0]]')] + [AstField(0, 'target', fkNode)] + [AstField(1, 'init', fkNullableNode)] + IVariableDeclarationNode = interface(IAstTypedNode) + {$region 'private'} + function GetTarget: IAstNode; + function GetInitializer: IAstNode; + function GetIsBoxed: Boolean; + {$endregion} + property Target: IAstNode read GetTarget; + property Initializer: IAstNode read GetInitializer; + property IsBoxed: Boolean read GetIsBoxed; + end; + + [AstTag('Assign')] + [AstDoc('Variable assignment.')] + [AstExample('["Assign", ["Id", "x"], ["Const", 1]]')] + [AstField(0, 'target', fkNode)] + [AstField(1, 'value', fkNode)] + IAssignmentNode = interface(IAstTypedNode) + {$region 'private'} + function GetTarget: IAstNode; + function GetValue: IAstNode; + {$endregion} + property Target: IAstNode read GetTarget; + property Value: IAstNode read GetValue; + end; + + [AstTag('Macro')] + [AstDoc('Syntactic macro definition.')] + [ + AstExample( + ''' + ["Macro", + ["Id", "unless"], + ["Tuple", [["Id", "condition"], ["Id", "body"]]], + ["Quote", ["If", ["Id", "condition"], ["Nop"], ["Unquote", ["Id", "body"]]]] + ] + ''' + ) + ] + [AstField(0, 'name', fkNode)] + [AstField(1, 'params', fkTuple)] + [AstField(2, 'body', fkNode)] + IMacroDefinitionNode = interface(IAstTypedNode) + {$region 'private'} + function GetName: IIdentifierNode; + function GetParameters: ITupleNode; + function GetBody: IAstNode; + {$endregion} + property Name: IIdentifierNode read GetName; + property Parameters: ITupleNode read GetParameters; + property Body: IAstNode read GetBody; + end; + + [AstTag('Quote')] + [AstDoc('Suppresses evaluation of an expression.')] + [AstField(0, 'expr', fkNode)] + IQuasiquoteNode = interface(IAstNode) + {$region 'private'} + function GetExpression: IAstNode; + {$endregion} + property Expression: IAstNode read GetExpression; + end; + + [AstTag('Unquote')] + [AstDoc('Enables evaluation inside a quoted context.')] + [AstField(0, 'expr', fkNode)] + IUnquoteNode = interface(IAstNode) + {$region 'private'} + function GetExpression: IAstNode; + {$endregion} + property Expression: IAstNode read GetExpression; + end; + + [AstTag('Splice')] + [AstDoc('Splicing evaluation into a list.')] + [AstField(0, 'expr', fkNode)] + IUnquoteSplicingNode = interface(IAstNode) + {$region 'private'} + function GetExpression: IQuasiquoteNode; + {$endregion} + property Expression: IQuasiquoteNode read GetExpression; + end; + + [AstTag('Index')] + [AstDoc('Element access by position.')] + [AstExample('["Index", ["Id", "v"], ["Const", 0]]')] + [AstField(0, 'base', fkNode)] + [AstField(1, 'index', fkNode)] + IIndexerNode = interface(IAstTypedNode) + {$region 'private'} + function GetBase: IAstNode; + function GetIndex: IAstNode; + {$endregion} + property Base: IAstNode read GetBase; + property Index: IAstNode read GetIndex; + end; + + [AstTag('Member')] + [AstDoc('Field access by keyword.')] + [AstExample('["Member", ["Id", "rec"], ["Key", "price"]]')] + [AstField(0, 'base', fkNode)] + [AstField(1, 'member', fkNode)] + IMemberAccessNode = interface(IAstTypedNode) + {$region 'private'} + function GetBase: IAstNode; + function GetMember: IKeywordNode; + {$endregion} + property Base: IAstNode read GetBase; + property Member: IKeywordNode read GetMember; + end; + + [AstTag('Record')] + [AstDoc('Defines a record literal.')] + [ + AstExample( + ''' + ["Record", ["Tuple", [ + ["Field", ["Key", "p"], ["Id", "p_val"]], + ["Field", ["Key", "q"], ["Const", 100]] + ]]] + ''' + ) + ] + [AstField(0, 'fields', fkTuple)] + IRecordLiteralNode = interface(IAstTypedNode) + {$region 'private'} + function GetFields: ITupleNode; + function GetGenericDefinition: IGenericRecordDefinition; + function GetScalarDefinition: IScalarRecordDefinition; + {$endregion} + property Fields: ITupleNode read GetFields; + property GenericDefinition: IGenericRecordDefinition read GetGenericDefinition; + property ScalarDefinition: IScalarRecordDefinition read GetScalarDefinition; + end; + + [AstTag('Series')] + [AstDoc('Stream schema definition.')] + [AstExample('["Series", ["Key", "Float"]]')] + [AstField(0, 'definition', fkNode)] + ICreateSeriesNode = interface(IAstTypedNode) + {$region 'private'} + function GetDefinitionNode: IAstNode; + function GetRecordDefinition: IScalarRecordDefinition; + {$endregion} + property DefinitionNode: IAstNode read GetDefinitionNode; + property RecordDefinition: IScalarRecordDefinition read GetRecordDefinition; + end; + + [AstTag('Add')] + [AstDoc('Pushes data to a series.')] + [AstExample('["Add", ["Id", "s"], ["Const", 10]]')] + [AstField(0, 'series', fkNode)] + [AstField(1, 'value', fkNode)] + [AstField(2, 'lookback', fkNullableNode)] + IAddSeriesItemNode = interface(IAstTypedNode) + {$region 'private'} + function GetSeries: IIdentifierNode; + function GetValue: IAstNode; + function GetLookback: IAstNode; + {$endregion} + property Series: IIdentifierNode read GetSeries; + property Value: IAstNode read GetValue; + property Lookback: IAstNode read GetLookback; + end; + + [AstTag('Count')] + [AstDoc('Series length.')] + [AstExample('["Count", ["Id", "src"]]')] + [AstField(0, 'series', fkNode)] + ISeriesLengthNode = interface(IAstTypedNode) + {$region 'private'} + function GetSeries: IIdentifierNode; + {$endregion} + property Series: IIdentifierNode read GetSeries; + end; + + [AstTag('Recur')] + [AstDoc('Tail-recursive jump.')] + [AstExample('["Recur", ["Tuple", [["Call", ["Id", "-"], ["Tuple", [["Id", "i"], ["Const", 1]]]]]]]')] + [AstField(0, 'args', fkTuple)] + IRecurNode = interface(IAstTypedNode) + {$region 'private'} + function GetArguments: ITupleNode; + {$endregion} + property Arguments: ITupleNode read GetArguments; + end; + + [AstTag('Pipe')] + [AstDoc('Reactive pipeline from source streams to a transformation lambda.')] + [ + AstExample( + ''' + ["Pipe", + ["Tuple", [ + ["Tuple", [["Id", "src"], ["Tuple", [["Key", "price"]]]]] + ]], + ["Fn", ["Tuple", [["Id", "p"]]], + ["Record", ["Tuple", [ + ["Field", ["Key", "res"], ["Call", ["Id", "*"], ["Tuple", [["Id", "p"], ["Const", 2]]]]] + ]]] + ] + ] + ''' + ) + ] + [AstField(0, 'inputs', fkTuple)] + [AstField(1, 'transform', fkNode)] + IPipeNode = interface(IAstTypedNode) + {$region 'private'} + function GetInputs: ITupleNode; + function GetTransformation: ILambdaExpressionNode; + {$endregion} + property Inputs: ITupleNode read GetInputs; + property Transformation: ILambdaExpressionNode read GetTransformation; + end; + IMacroExpansionNode = interface(IAstTypedNode) {$region 'private'} function GetCallNode: IFunctionCallNode; @@ -354,189 +624,6 @@ type property ExpandedBody: IAstNode read GetExpandedBody; end; - [AstTag('Recur')] - IRecurNode = interface(IAstTypedNode) - {$region 'private'} - function GetArguments: ITupleNode; - {$endregion} - [AstField(0, 'args', fkTuple)] - property Arguments: ITupleNode read GetArguments; - end; - - [AstTag('Block')] - IBlockExpressionNode = interface(IAstTypedNode) - {$region 'private'} - function GetExpressions: ITupleNode; - {$endregion} - [AstField(0, 'expressions', fkTuple)] - property Expressions: ITupleNode read GetExpressions; - end; - - [AstTag('Var')] - IVariableDeclarationNode = interface(IAstTypedNode) - {$region 'private'} - function GetTarget: IAstNode; - function GetInitializer: IAstNode; - function GetIsBoxed: Boolean; - {$endregion} - [AstField(0, 'target', fkNode)] - property Target: IAstNode read GetTarget; - - [AstField(1, 'init', fkNullableNode)] - property Initializer: IAstNode read GetInitializer; - - property IsBoxed: Boolean read GetIsBoxed; - end; - - [AstTag('Assign')] - IAssignmentNode = interface(IAstTypedNode) - {$region 'private'} - function GetTarget: IAstNode; - function GetValue: IAstNode; - {$endregion} - [AstField(0, 'target', fkNode)] - property Target: IAstNode read GetTarget; - - [AstField(1, 'value', fkNode)] - property Value: IAstNode read GetValue; - end; - - [AstTag('Macro')] - IMacroDefinitionNode = interface(IAstTypedNode) - {$region 'private'} - function GetName: IIdentifierNode; - function GetParameters: ITupleNode; - function GetBody: IAstNode; - {$endregion} - [AstField(0, 'name', fkNode)] - property Name: IIdentifierNode read GetName; - - [AstField(1, 'params', fkTuple)] - property Parameters: ITupleNode read GetParameters; - - [AstField(2, 'body', fkNode)] - property Body: IAstNode read GetBody; - end; - - [AstTag('Quote')] - IQuasiquoteNode = interface(IAstNode) - {$region 'private'} - function GetExpression: IAstNode; - {$endregion} - [AstField(0, 'expr', fkNode)] - property Expression: IAstNode read GetExpression; - end; - - [AstTag('Unquote')] - IUnquoteNode = interface(IAstNode) - {$region 'private'} - function GetExpression: IAstNode; - {$endregion} - [AstField(0, 'expr', fkNode)] - property Expression: IAstNode read GetExpression; - end; - - [AstTag('Splice')] - IUnquoteSplicingNode = interface(IAstNode) - {$region 'private'} - function GetExpression: IQuasiquoteNode; - {$endregion} - [AstField(0, 'expr', fkNode)] - property Expression: IQuasiquoteNode read GetExpression; - end; - - [AstTag('Index')] - IIndexerNode = interface(IAstTypedNode) - {$region 'private'} - function GetBase: IAstNode; - function GetIndex: IAstNode; - {$endregion} - [AstField(0, 'base', fkNode)] - property Base: IAstNode read GetBase; - - [AstField(1, 'index', fkNode)] - property Index: IAstNode read GetIndex; - end; - - [AstTag('Member')] - IMemberAccessNode = interface(IAstTypedNode) - {$region 'private'} - function GetBase: IAstNode; - function GetMember: IKeywordNode; - {$endregion} - [AstField(0, 'base', fkNode)] - property Base: IAstNode read GetBase; - - [AstField(1, 'member', fkNode)] - property Member: IKeywordNode read GetMember; - end; - - [AstTag('Record')] - IRecordLiteralNode = interface(IAstTypedNode) - {$region 'private'} - function GetFields: ITupleNode; - function GetGenericDefinition: IGenericRecordDefinition; - function GetScalarDefinition: IScalarRecordDefinition; - {$endregion} - [AstField(0, 'fields', fkTuple)] - property Fields: ITupleNode read GetFields; - - property GenericDefinition: IGenericRecordDefinition read GetGenericDefinition; - property ScalarDefinition: IScalarRecordDefinition read GetScalarDefinition; - end; - - [AstTag('Series')] - ICreateSeriesNode = interface(IAstTypedNode) - {$region 'private'} - function GetDefinitionNode: IAstNode; - function GetRecordDefinition: IScalarRecordDefinition; - {$endregion} - [AstField(0, 'definition', fkNode)] - property DefinitionNode: IAstNode read GetDefinitionNode; - - property RecordDefinition: IScalarRecordDefinition read GetRecordDefinition; - end; - - [AstTag('Add')] - IAddSeriesItemNode = interface(IAstTypedNode) - {$region 'private'} - function GetSeries: IIdentifierNode; - function GetValue: IAstNode; - function GetLookback: IAstNode; - {$endregion} - [AstField(0, 'series', fkNode)] - property Series: IIdentifierNode read GetSeries; - - [AstField(1, 'value', fkNode)] - property Value: IAstNode read GetValue; - - [AstField(2, 'lookback', fkNullableNode)] - property Lookback: IAstNode read GetLookback; - end; - - [AstTag('Count')] - ISeriesLengthNode = interface(IAstTypedNode) - {$region 'private'} - function GetSeries: IIdentifierNode; - {$endregion} - [AstField(0, 'series', fkNode)] - property Series: IIdentifierNode read GetSeries; - end; - - // The main pipe definition: (pipe [[source [:sel]]...] (fn ...)) - [AstTag('Pipe')] - IPipeNode = interface(IAstTypedNode) - {$region 'private'} - function GetInputs: ITupleNode; - function GetTransformation: ILambdaExpressionNode; - {$endregion} - [AstField(0, 'inputs', fkTuple)] - property Inputs: ITupleNode read GetInputs; - - [AstField(1, 'transform', fkNode)] - property Transformation: ILambdaExpressionNode read GetTransformation; - end; - IAstVisitor = interface function Visit(const Node: IAstNode): TDataValue; end; @@ -547,6 +634,8 @@ type TEvaluatorFactory = reference to function(const Scope: IExecutionScope): IEvaluatorVisitor; + // --- Base Implementations --- + TAstNode = class(TInterfacedObject, IAstNode) private FIdentity: IAstIdentity; @@ -556,16 +645,14 @@ type function GetIsTyped: Boolean; virtual; public constructor Create(const AIdentity: IAstIdentity); - function Accept(const Visitor: IAstVisitor): TDataValue; virtual; + function AsTypedNode: IAstTypedNode; virtual; function AsConstant: IConstantNode; virtual; function AsIdentifier: IIdentifierNode; virtual; function AsKeyword: IKeywordNode; virtual; - - function AsRecordField: IRecordFieldNode; virtual; function AsTuple: ITupleNode; virtual; - + function AsRecordField: IRecordFieldNode; virtual; function AsIfExpression: IIfExpressionNode; virtual; function AsCondExpression: ICondExpressionNode; virtual; function AsLambdaExpression: ILambdaExpressionNode; virtual; @@ -586,11 +673,8 @@ type function AsSeriesLength: ISeriesLengthNode; virtual; function AsRecur: IRecurNode; virtual; function AsNop: INopNode; virtual; - function AsPipe: IPipeNode; virtual; - function AsTypedNode: IAstTypedNode; virtual; - property IsTyped: Boolean read GetIsTyped; property Kind: TAstNodeKind read GetKind; property Identity: IAstIdentity read GetIdentity; @@ -608,24 +692,11 @@ type property StaticType: IStaticType read GetStaticType; end; - TRecordFieldNode = class(TAstNode, IRecordFieldNode) - private - FKey: IKeywordNode; - FValue: IAstNode; - function GetKey: IKeywordNode; - function GetValue: IAstNode; - protected - function GetKind: TAstNodeKind; override; - public - constructor Create(const AKey: IKeywordNode; const AValue: IAstNode; const AIdentity: IAstIdentity); - function AsRecordField: IRecordFieldNode; override; - end; - - // --- Core Nodes Implementations --- + // --- Core Node Concrete Implementations --- TConstantNode = class(TAstTypedNode, IConstantNode) private - FConstIdentity: IConstantIdentity; // Typed reference for fast access + FConstIdentity: IConstantIdentity; function GetValue: TDataValue; protected function GetKind: TAstNodeKind; override; @@ -636,7 +707,7 @@ type TIdentifierNode = class(TAstTypedNode, IIdentifierNode) private - FNamedIdentity: INamedIdentity; // Typed reference for fast access + FNamedIdentity: INamedIdentity; FAddress: TResolvedAddress; function GetAddress: TResolvedAddress; function GetName: string; @@ -669,22 +740,17 @@ type function AsTuple: ITupleNode; override; end; - TCreateSeriesNode = class(TAstTypedNode, ICreateSeriesNode) + TRecordFieldNode = class(TAstNode, IRecordFieldNode) private - FDefinitionNode: IAstNode; - FRecordDefinition: IScalarRecordDefinition; - function GetDefinitionNode: IAstNode; - function GetRecordDefinition: IScalarRecordDefinition; + FKey: IKeywordNode; + FValue: IAstNode; + function GetKey: IKeywordNode; + function GetValue: IAstNode; protected function GetKind: TAstNodeKind; override; public - constructor Create( - const ADefinitionNode: IAstNode; - const ARecordDefinition: IScalarRecordDefinition; - const AStaticType: IStaticType; - const AIdentity: IAstIdentity - ); - function AsCreateSeries: ICreateSeriesNode; override; + constructor Create(const AKey: IKeywordNode; const AValue: IAstNode; const AIdentity: IAstIdentity); + function AsRecordField: IRecordFieldNode; override; end; TIfExpressionNode = class(TAstTypedNode, IIfExpressionNode) @@ -780,26 +846,6 @@ type function AsFunctionCall: IFunctionCallNode; override; end; - TMacroDefinitionNode = class(TAstTypedNode, IMacroDefinitionNode) - private - FName: IIdentifierNode; - FParameters: ITupleNode; - FBody: IAstNode; - function GetName: IIdentifierNode; - function GetParameters: ITupleNode; - function GetBody: IAstNode; - protected - function GetKind: TAstNodeKind; override; - public - constructor Create( - const AName: IIdentifierNode; - const AParameters: ITupleNode; - const ABody: IAstNode; - const AIdentity: IAstIdentity - ); - function AsMacroDefinition: IMacroDefinitionNode; override; - end; - TMacroExpansionNode = class(TAstTypedNode, IMacroExpansionNode) private FCallNode: IFunctionCallNode; @@ -813,50 +859,6 @@ type function AsMacroExpansion: IMacroExpansionNode; override; end; - TQuasiquoteNode = class(TAstNode, IQuasiquoteNode) - private - FExpression: IAstNode; - function GetExpression: IAstNode; - protected - function GetKind: TAstNodeKind; override; - public - constructor Create(const AExpression: IAstNode; const AIdentity: IAstIdentity); - function AsQuasiquote: IQuasiquoteNode; override; - end; - - TUnquoteNode = class(TAstNode, IUnquoteNode) - private - FExpression: IAstNode; - function GetExpression: IAstNode; - protected - function GetKind: TAstNodeKind; override; - public - constructor Create(const AExpression: IAstNode; const AIdentity: IAstIdentity); - function AsUnquote: IUnquoteNode; override; - end; - - TUnquoteSplicingNode = class(TAstNode, IUnquoteSplicingNode) - private - FExpression: IQuasiquoteNode; - function GetExpression: IQuasiquoteNode; - protected - function GetKind: TAstNodeKind; override; - public - constructor Create(const AExpression: IQuasiquoteNode; const AIdentity: IAstIdentity); - function AsUnquoteSplicing: IUnquoteSplicingNode; override; - end; - - TRecurNode = class(TAstTypedNode, IRecurNode) - private - FArguments: ITupleNode; - function GetArguments: ITupleNode; - protected - function GetKind: TAstNodeKind; override; - public - constructor Create(const AArguments: ITupleNode; const AStaticType: IStaticType; const AIdentity: IAstIdentity); - function AsRecur: IRecurNode; override; - end; - TBlockExpressionNode = class(TAstTypedNode, IBlockExpressionNode) private FExpressions: ITupleNode; @@ -900,6 +902,59 @@ type function AsAssignment: IAssignmentNode; override; end; + TMacroDefinitionNode = class(TAstTypedNode, IMacroDefinitionNode) + private + FName: IIdentifierNode; + FParameters: ITupleNode; + FBody: IAstNode; + function GetName: IIdentifierNode; + function GetParameters: ITupleNode; + function GetBody: IAstNode; + protected + function GetKind: TAstNodeKind; override; + public + constructor Create( + const AName: IIdentifierNode; + const AParameters: ITupleNode; + const ABody: IAstNode; + const AIdentity: IAstIdentity + ); + function AsMacroDefinition: IMacroDefinitionNode; override; + end; + + TQuasiquoteNode = class(TAstNode, IQuasiquoteNode) + private + FExpression: IAstNode; + function GetExpression: IAstNode; + protected + function GetKind: TAstNodeKind; override; + public + constructor Create(const AExpression: IAstNode; const AIdentity: IAstIdentity); + function AsQuasiquote: IQuasiquoteNode; override; + end; + + TUnquoteNode = class(TAstNode, IUnquoteNode) + private + FExpression: IAstNode; + function GetExpression: IAstNode; + protected + function GetKind: TAstNodeKind; override; + public + constructor Create(const AExpression: IAstNode; const AIdentity: IAstIdentity); + function AsUnquote: IUnquoteNode; override; + end; + + TUnquoteSplicingNode = class(TAstNode, IUnquoteSplicingNode) + private + FExpression: IQuasiquoteNode; + function GetExpression: IQuasiquoteNode; + protected + function GetKind: TAstNodeKind; override; + public + constructor Create(const AExpression: IQuasiquoteNode; const AIdentity: IAstIdentity); + function AsUnquoteSplicing: IUnquoteSplicingNode; override; + end; + TIndexerNode = class(TAstTypedNode, IIndexerNode) private FBase, FIndex: IAstNode; @@ -951,6 +1006,24 @@ type function AsRecordLiteral: IRecordLiteralNode; override; end; + TCreateSeriesNode = class(TAstTypedNode, ICreateSeriesNode) + private + FDefinitionNode: IAstNode; + FRecordDefinition: IScalarRecordDefinition; + function GetDefinitionNode: IAstNode; + function GetRecordDefinition: IScalarRecordDefinition; + protected + function GetKind: TAstNodeKind; override; + public + constructor Create( + const ADefinitionNode: IAstNode; + const ARecordDefinition: IScalarRecordDefinition; + const AStaticType: IStaticType; + const AIdentity: IAstIdentity + ); + function AsCreateSeries: ICreateSeriesNode; override; + end; + TAddSeriesItemNode = class(TAstTypedNode, IAddSeriesItemNode) private FSeries: IIdentifierNode; @@ -981,6 +1054,17 @@ type function AsSeriesLength: ISeriesLengthNode; override; end; + TRecurNode = class(TAstTypedNode, IRecurNode) + private + FArguments: ITupleNode; + function GetArguments: ITupleNode; + protected + function GetKind: TAstNodeKind; override; + public + constructor Create(const AArguments: ITupleNode; const AStaticType: IStaticType; const AIdentity: IAstIdentity); + function AsRecur: IRecurNode; override; + end; + TNopNode = class(TAstTypedNode, INopNode) protected function GetKind: TAstNodeKind; override; @@ -1010,10 +1094,10 @@ type implementation uses - System.Classes, - System.Rtti, - System.StrUtils, - System.TypInfo; // Added for GetEnumName + system.classes, + system.rtti, + system.strutils, + system.typinfo; { TCompiledFunction } @@ -1028,9 +1112,7 @@ end; function TAstNodeKindHelper.ToString: string; begin - Result := GetEnumName(TypeInfo(TAstNodeKind), Ord(Self)); - Assert(StartsText('ak', Result)); - Result := Result.Substring(2); + Result := GetEnumName(TypeInfo(TAstNodeKind), Ord(Self)).Substring(2); end; { TCondPair } @@ -1056,13 +1138,9 @@ var begin location := ''; if Assigned(Node) and Assigned(Node.Identity) and Assigned(Node.Identity.Location) then - begin - location := Node.Identity.Location.ToString + ' '; - end + location := Node.Identity.Location.ToString + ' ' else if Assigned(Node) and Assigned(Node.Identity) then - begin location := '[' + Node.Identity.ToString + '] '; - end; case Level of elHint: Result := '[Hint] '; @@ -1102,13 +1180,11 @@ begin end; function TCompilerLog.HasErrors: Boolean; -var - entry: TCompilerError; begin - Result := False; - for entry in FEntries do + for var entry in FEntries do if entry.Level = elError then - Exit(True); + exit(True); + Result := False; end; function TCompilerLog.GetEntryCount: Integer; @@ -1124,30 +1200,20 @@ end; { ECompilationFailed } constructor ECompilationFailed.Create(const AErrors: TArray); -var - msg: string; begin - if Length(AErrors) > 0 then - msg := Format('Compilation failed with %d error(s). First: %s', [Length(AErrors), AErrors[0].Message]) - else - msg := 'Compilation failed with unspecified errors.'; - inherited Create(msg); + inherited Create(Format('Compilation failed with %d error(s).', [Length(AErrors)])); FErrors := AErrors; end; function ECompilationFailed.ToString: string; var sb: TStringBuilder; - err: TCompilerError; begin sb := TStringBuilder.Create; try - sb.AppendLine(Message); - for err in FErrors do - begin - sb.Append(' - '); - sb.AppendLine(err.ToString); - end; + sb.AppendLine(inherited Message); + for var err in FErrors do + sb.AppendLine(' - ' + err.ToString); Result := sb.ToString; finally sb.Free; @@ -1174,142 +1240,113 @@ end; function TAstNode.Accept(const Visitor: IAstVisitor): TDataValue; begin - // Central Dispatch: Delegate to the generic Visit method of the visitor. - // The visitor uses Node.Kind to look up the correct handler. Result := Visitor.Visit(Self); end; -// Default implementations for As... casting methods (Return nil) -function TAstNode.AsConstant: IConstantNode; -begin - Result := nil; -end; - -function TAstNode.AsIdentifier: IIdentifierNode; -begin - Result := nil; -end; - -function TAstNode.AsKeyword: IKeywordNode; -begin - Result := nil; -end; - -function TAstNode.AsRecordField: IRecordFieldNode; -begin - Result := nil; -end; - -function TAstNode.AsTuple: ITupleNode; -begin - Result := nil; -end; - -function TAstNode.AsIfExpression: IIfExpressionNode; -begin - Result := nil; -end; - -function TAstNode.AsCondExpression: ICondExpressionNode; -begin - Result := nil; -end; - -function TAstNode.AsLambdaExpression: ILambdaExpressionNode; -begin - Result := nil; -end; - -function TAstNode.AsFunctionCall: IFunctionCallNode; -begin - Result := nil; -end; - -function TAstNode.AsMacroExpansion: IMacroExpansionNode; -begin - Result := nil; -end; - -function TAstNode.AsBlockExpression: IBlockExpressionNode; -begin - Result := nil; -end; - -function TAstNode.AsVariableDeclaration: IVariableDeclarationNode; -begin - Result := nil; -end; - -function TAstNode.AsAssignment: IAssignmentNode; -begin - Result := nil; -end; - -function TAstNode.AsMacroDefinition: IMacroDefinitionNode; -begin - Result := nil; -end; - -function TAstNode.AsQuasiquote: IQuasiquoteNode; -begin - Result := nil; -end; - -function TAstNode.AsUnquote: IUnquoteNode; -begin - Result := nil; -end; - -function TAstNode.AsUnquoteSplicing: IUnquoteSplicingNode; -begin - Result := nil; -end; - -function TAstNode.AsIndexer: IIndexerNode; -begin - Result := nil; -end; - -function TAstNode.AsMemberAccess: IMemberAccessNode; -begin - Result := nil; -end; - -function TAstNode.AsRecordLiteral: IRecordLiteralNode; -begin - Result := nil; -end; - -function TAstNode.AsCreateSeries: ICreateSeriesNode; -begin - Result := nil; -end; - -function TAstNode.AsAddSeriesItem: IAddSeriesItemNode; -begin - Result := nil; -end; - -function TAstNode.AsSeriesLength: ISeriesLengthNode; -begin - Result := nil; -end; - -function TAstNode.AsRecur: IRecurNode; -begin - Result := nil; -end; - -function TAstNode.AsNop: INopNode; -begin - Result := nil; -end; - function TAstNode.AsTypedNode: IAstTypedNode; begin Result := nil; end; - +function TAstNode.AsConstant: IConstantNode; +begin + Result := nil; +end; +function TAstNode.AsIdentifier: IIdentifierNode; +begin + Result := nil; +end; +function TAstNode.AsKeyword: IKeywordNode; +begin + Result := nil; +end; +function TAstNode.AsTuple: ITupleNode; +begin + Result := nil; +end; +function TAstNode.AsRecordField: IRecordFieldNode; +begin + Result := nil; +end; +function TAstNode.AsIfExpression: IIfExpressionNode; +begin + Result := nil; +end; +function TAstNode.AsCondExpression: ICondExpressionNode; +begin + Result := nil; +end; +function TAstNode.AsLambdaExpression: ILambdaExpressionNode; +begin + Result := nil; +end; +function TAstNode.AsFunctionCall: IFunctionCallNode; +begin + Result := nil; +end; +function TAstNode.AsMacroExpansion: IMacroExpansionNode; +begin + Result := nil; +end; +function TAstNode.AsBlockExpression: IBlockExpressionNode; +begin + Result := nil; +end; +function TAstNode.AsVariableDeclaration: IVariableDeclarationNode; +begin + Result := nil; +end; +function TAstNode.AsAssignment: IAssignmentNode; +begin + Result := nil; +end; +function TAstNode.AsMacroDefinition: IMacroDefinitionNode; +begin + Result := nil; +end; +function TAstNode.AsQuasiquote: IQuasiquoteNode; +begin + Result := nil; +end; +function TAstNode.AsUnquote: IUnquoteNode; +begin + Result := nil; +end; +function TAstNode.AsUnquoteSplicing: IUnquoteSplicingNode; +begin + Result := nil; +end; +function TAstNode.AsIndexer: IIndexerNode; +begin + Result := nil; +end; +function TAstNode.AsMemberAccess: IMemberAccessNode; +begin + Result := nil; +end; +function TAstNode.AsRecordLiteral: IRecordLiteralNode; +begin + Result := nil; +end; +function TAstNode.AsCreateSeries: ICreateSeriesNode; +begin + Result := nil; +end; +function TAstNode.AsAddSeriesItem: IAddSeriesItemNode; +begin + Result := nil; +end; +function TAstNode.AsSeriesLength: ISeriesLengthNode; +begin + Result := nil; +end; +function TAstNode.AsRecur: IRecurNode; +begin + Result := nil; +end; +function TAstNode.AsNop: INopNode; +begin + Result := nil; +end; function TAstNode.AsPipe: IPipeNode; begin Result := nil; @@ -1338,35 +1375,6 @@ begin Result := Self; end; -{ TRecordFieldNode } - -constructor TRecordFieldNode.Create(const AKey: IKeywordNode; const AValue: IAstNode; const AIdentity: IAstIdentity); -begin - inherited Create(AIdentity); - FKey := AKey; - FValue := AValue; -end; - -function TRecordFieldNode.AsRecordField: IRecordFieldNode; -begin - Result := Self; -end; - -function TRecordFieldNode.GetKey: IKeywordNode; -begin - Result := FKey; -end; - -function TRecordFieldNode.GetKind: TAstNodeKind; -begin - Result := akRecordField; -end; - -function TRecordFieldNode.GetValue: IAstNode; -begin - Result := FValue; -end; - { TConstantNode } constructor TConstantNode.Create(const AIdentity: IConstantIdentity; const AStaticType: IStaticType); @@ -1375,20 +1383,18 @@ begin FConstIdentity := AIdentity; end; -function TConstantNode.AsConstant: IConstantNode; -begin - Result := Self; -end; - function TConstantNode.GetKind: TAstNodeKind; begin Result := akConstant; end; - function TConstantNode.GetValue: TDataValue; begin Result := FConstIdentity.Value; end; +function TConstantNode.AsConstant: IConstantNode; +begin + Result := Self; +end; { TIdentifierNode } @@ -1399,25 +1405,22 @@ begin FAddress := AAddress; end; -function TIdentifierNode.AsIdentifier: IIdentifierNode; -begin - Result := Self; -end; - -function TIdentifierNode.GetAddress: TResolvedAddress; -begin - Result := FAddress; -end; - function TIdentifierNode.GetKind: TAstNodeKind; begin Result := akIdentifier; end; - +function TIdentifierNode.GetAddress: TResolvedAddress; +begin + Result := FAddress; +end; function TIdentifierNode.GetName: string; begin Result := FNamedIdentity.Name; end; +function TIdentifierNode.AsIdentifier: IIdentifierNode; +begin + Result := Self; +end; { TKeywordNode } @@ -1427,20 +1430,18 @@ begin FKeywordIdentity := AIdentity; end; -function TKeywordNode.AsKeyword: IKeywordNode; -begin - Result := Self; -end; - function TKeywordNode.GetKind: TAstNodeKind; begin Result := akKeyword; end; - function TKeywordNode.GetValue: IKeyword; begin Result := FKeywordIdentity.Value; end; +function TKeywordNode.AsKeyword: IKeywordNode; +begin + Result := Self; +end; { TTupleNode } @@ -1450,55 +1451,45 @@ begin FElements := AElements; end; +function TTupleNode.GetKind: TAstNodeKind; +begin + Result := akTuple; +end; +function TTupleNode.GetElements: TArray; +begin + Result := FElements; +end; function TTupleNode.AsTuple: ITupleNode; begin Result := Self; end; -function TTupleNode.GetElements: TArray; +{ TRecordFieldNode } + +constructor TRecordFieldNode.Create(const AKey: IKeywordNode; const AValue: IAstNode; const AIdentity: IAstIdentity); begin - Result := FElements; + inherited Create(AIdentity); + FKey := AKey; + FValue := AValue; end; -function TTupleNode.GetKind: TAstNodeKind; +function TRecordFieldNode.GetKind: TAstNodeKind; begin - Result := akTuple; + Result := akRecordField; end; - -{ TCreateSeriesNode } - -constructor TCreateSeriesNode.Create( - const ADefinitionNode: IAstNode; - const ARecordDefinition: IScalarRecordDefinition; - const AStaticType: IStaticType; - const AIdentity: IAstIdentity -); +function TRecordFieldNode.GetKey: IKeywordNode; begin - inherited Create(AStaticType, AIdentity); - FDefinitionNode := ADefinitionNode; - FRecordDefinition := ARecordDefinition; + Result := FKey; end; - -function TCreateSeriesNode.AsCreateSeries: ICreateSeriesNode; +function TRecordFieldNode.GetValue: IAstNode; +begin + Result := FValue; +end; +function TRecordFieldNode.AsRecordField: IRecordFieldNode; begin Result := Self; end; -function TCreateSeriesNode.GetDefinitionNode: IAstNode; -begin - Result := FDefinitionNode; -end; - -function TCreateSeriesNode.GetRecordDefinition: IScalarRecordDefinition; -begin - Result := FRecordDefinition; -end; - -function TCreateSeriesNode.GetKind: TAstNodeKind; -begin - Result := akCreateSeries; -end; - { TIfExpressionNode } constructor TIfExpressionNode.Create( @@ -1513,11 +1504,10 @@ begin FElseBranch := AElseBranch; end; -function TIfExpressionNode.AsIfExpression: IIfExpressionNode; +function TIfExpressionNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akIfExpression; end; - function TIfExpressionNode.GetCondition: IAstNode; begin Result := FCondition; @@ -1530,9 +1520,9 @@ function TIfExpressionNode.GetElseBranch: IAstNode; begin Result := FElseBranch; end; -function TIfExpressionNode.GetKind: TAstNodeKind; +function TIfExpressionNode.AsIfExpression: IIfExpressionNode; begin - Result := akIfExpression; + Result := Self; end; { TCondExpressionNode } @@ -1549,24 +1539,21 @@ begin FElseBranch := AElseBranch; end; -function TCondExpressionNode.AsCondExpression: ICondExpressionNode; +function TCondExpressionNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akCondExpression; end; - function TCondExpressionNode.GetPairs: TArray; begin Result := FPairs; end; - function TCondExpressionNode.GetElseBranch: IAstNode; begin Result := FElseBranch; end; - -function TCondExpressionNode.GetKind: TAstNodeKind; +function TCondExpressionNode.AsCondExpression: ICondExpressionNode; begin - Result := akCondExpression; + Result := Self; end; { TLambdaExpressionNode } @@ -1583,10 +1570,6 @@ constructor TLambdaExpressionNode.Create( ); begin inherited Create(AStaticType, AIdentity); - - Assert(Assigned(AParameters)); - Assert(Assigned(ABody)); - FParameters := AParameters; FBody := ABody; FLayout := ALayout; @@ -1596,19 +1579,18 @@ begin FIsPure := AIsPure; end; -function TLambdaExpressionNode.AsLambdaExpression: ILambdaExpressionNode; +function TLambdaExpressionNode.GetKind: TAstNodeKind; begin - Result := Self; -end; - -function TLambdaExpressionNode.GetBody: IAstNode; -begin - Result := FBody; + Result := akLambdaExpression; end; function TLambdaExpressionNode.GetParameters: ITupleNode; begin Result := FParameters; end; +function TLambdaExpressionNode.GetBody: IAstNode; +begin + Result := FBody; +end; function TLambdaExpressionNode.GetLayout: IScopeLayout; begin Result := FLayout; @@ -1629,9 +1611,9 @@ function TLambdaExpressionNode.GetIsPure: Boolean; begin Result := FIsPure; end; -function TLambdaExpressionNode.GetKind: TAstNodeKind; +function TLambdaExpressionNode.AsLambdaExpression: ILambdaExpressionNode; begin - Result := akLambdaExpression; + Result := Self; end; { TFunctionCallNode } @@ -1654,11 +1636,10 @@ begin FIsTargetPure := AIsTargetPure; end; -function TFunctionCallNode.AsFunctionCall: IFunctionCallNode; +function TFunctionCallNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akFunctionCall; end; - function TFunctionCallNode.GetCallee: IAstNode; begin Result := FCallee; @@ -1679,65 +1660,28 @@ function TFunctionCallNode.GetIsTargetPure: Boolean; begin Result := FIsTargetPure; end; -function TFunctionCallNode.GetKind: TAstNodeKind; -begin - Result := akFunctionCall; -end; - -{ TMacroDefinitionNode } - -constructor TMacroDefinitionNode.Create( - const AName: IIdentifierNode; - const AParameters: ITupleNode; - const ABody: IAstNode; - const AIdentity: IAstIdentity -); -begin - inherited Create(TTypes.Void, AIdentity); - FName := AName; - FParameters := AParameters; - FBody := ABody; -end; - -function TMacroDefinitionNode.AsMacroDefinition: IMacroDefinitionNode; +function TFunctionCallNode.AsFunctionCall: IFunctionCallNode; begin Result := Self; end; -function TMacroDefinitionNode.GetName: IIdentifierNode; -begin - Result := FName; -end; -function TMacroDefinitionNode.GetParameters: ITupleNode; -begin - Result := FParameters; -end; -function TMacroDefinitionNode.GetBody: IAstNode; -begin - Result := FBody; -end; -function TMacroDefinitionNode.GetKind: TAstNodeKind; -begin - Result := akMacroDefinition; -end; - { TMacroExpansionNode } constructor TMacroExpansionNode.Create(const ACallNode: IFunctionCallNode; const AExpandedBody: IAstNode; const AIdentity: IAstIdentity); begin - if AExpandedBody.IsTyped then - inherited Create(AExpandedBody.AsTypedNode.StaticType, AIdentity) - else - inherited Create(TTypes.Unknown, AIdentity); + inherited Create( + if AExpandedBody.IsTyped then AExpandedBody.AsTypedNode.StaticType + else TTypes.Unknown, + AIdentity + ); FCallNode := ACallNode; FExpandedBody := AExpandedBody; end; -function TMacroExpansionNode.AsMacroExpansion: IMacroExpansionNode; +function TMacroExpansionNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akMacroExpansion; end; - function TMacroExpansionNode.GetCallNode: IFunctionCallNode; begin Result := FCallNode; @@ -1746,99 +1690,11 @@ function TMacroExpansionNode.GetExpandedBody: IAstNode; begin Result := FExpandedBody; end; -function TMacroExpansionNode.GetKind: TAstNodeKind; -begin - Result := akMacroExpansion; -end; - -{ TQuasiquoteNode } - -constructor TQuasiquoteNode.Create(const AExpression: IAstNode; const AIdentity: IAstIdentity); -begin - inherited Create(AIdentity); - FExpression := AExpression; -end; - -function TQuasiquoteNode.AsQuasiquote: IQuasiquoteNode; +function TMacroExpansionNode.AsMacroExpansion: IMacroExpansionNode; begin Result := Self; end; -function TQuasiquoteNode.GetExpression: IAstNode; -begin - Result := FExpression; -end; -function TQuasiquoteNode.GetKind: TAstNodeKind; -begin - Result := akQuasiquote; -end; - -{ TUnquoteNode } - -constructor TUnquoteNode.Create(const AExpression: IAstNode; const AIdentity: IAstIdentity); -begin - inherited Create(AIdentity); - FExpression := AExpression; -end; - -function TUnquoteNode.AsUnquote: IUnquoteNode; -begin - Result := Self; -end; - -function TUnquoteNode.GetExpression: IAstNode; -begin - Result := FExpression; -end; -function TUnquoteNode.GetKind: TAstNodeKind; -begin - Result := akUnquote; -end; - -{ TUnquoteSplicingNode } - -constructor TUnquoteSplicingNode.Create(const AExpression: IQuasiquoteNode; const AIdentity: IAstIdentity); -begin - inherited Create(AIdentity); - FExpression := AExpression; -end; - -function TUnquoteSplicingNode.AsUnquoteSplicing: IUnquoteSplicingNode; -begin - Result := Self; -end; - -function TUnquoteSplicingNode.GetExpression: IQuasiquoteNode; -begin - Result := FExpression; -end; -function TUnquoteSplicingNode.GetKind: TAstNodeKind; -begin - Result := akUnquoteSplicing; -end; - -{ TRecurNode } - -constructor TRecurNode.Create(const AArguments: ITupleNode; const AStaticType: IStaticType; const AIdentity: IAstIdentity); -begin - inherited Create(AStaticType, AIdentity); - FArguments := AArguments; -end; - -function TRecurNode.AsRecur: IRecurNode; -begin - Result := Self; -end; - -function TRecurNode.GetArguments: ITupleNode; -begin - Result := FArguments; -end; -function TRecurNode.GetKind: TAstNodeKind; -begin - Result := akRecur; -end; - { TBlockExpressionNode } constructor TBlockExpressionNode.Create(const AExpressions: ITupleNode; const AStaticType: IStaticType; const AIdentity: IAstIdentity); @@ -1847,18 +1703,17 @@ begin FExpressions := AExpressions; end; -function TBlockExpressionNode.AsBlockExpression: IBlockExpressionNode; +function TBlockExpressionNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akBlockExpression; end; - function TBlockExpressionNode.GetExpressions: ITupleNode; begin Result := FExpressions; end; -function TBlockExpressionNode.GetKind: TAstNodeKind; +function TBlockExpressionNode.AsBlockExpression: IBlockExpressionNode; begin - Result := akBlockExpression; + Result := Self; end; { TVariableDeclarationNode } @@ -1877,11 +1732,10 @@ begin FIsBoxed := AIsBoxed; end; -function TVariableDeclarationNode.AsVariableDeclaration: IVariableDeclarationNode; +function TVariableDeclarationNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akVariableDeclaration; end; - function TVariableDeclarationNode.GetTarget: IAstNode; begin Result := FTarget; @@ -1894,9 +1748,9 @@ function TVariableDeclarationNode.GetIsBoxed: Boolean; begin Result := FIsBoxed; end; -function TVariableDeclarationNode.GetKind: TAstNodeKind; +function TVariableDeclarationNode.AsVariableDeclaration: IVariableDeclarationNode; begin - Result := akVariableDeclaration; + Result := Self; end; { TAssignmentNode } @@ -1908,11 +1762,10 @@ begin FValue := AValue; end; -function TAssignmentNode.AsAssignment: IAssignmentNode; +function TAssignmentNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akAssignment; end; - function TAssignmentNode.GetTarget: IAstNode; begin Result := FTarget; @@ -1921,9 +1774,108 @@ function TAssignmentNode.GetValue: IAstNode; begin Result := FValue; end; -function TAssignmentNode.GetKind: TAstNodeKind; +function TAssignmentNode.AsAssignment: IAssignmentNode; begin - Result := akAssignment; + Result := Self; +end; + +{ TMacroDefinitionNode } + +constructor TMacroDefinitionNode.Create( + const AName: IIdentifierNode; + const AParameters: ITupleNode; + const ABody: IAstNode; + const AIdentity: IAstIdentity +); +begin + inherited Create(TTypes.Void, AIdentity); + FName := AName; + FParameters := AParameters; + FBody := ABody; +end; + +function TMacroDefinitionNode.GetKind: TAstNodeKind; +begin + Result := akMacroDefinition; +end; +function TMacroDefinitionNode.GetName: IIdentifierNode; +begin + Result := FName; +end; +function TMacroDefinitionNode.GetParameters: ITupleNode; +begin + Result := FParameters; +end; +function TMacroDefinitionNode.GetBody: IAstNode; +begin + Result := FBody; +end; +function TMacroDefinitionNode.AsMacroDefinition: IMacroDefinitionNode; +begin + Result := Self; +end; + +{ TQuasiquoteNode } + +constructor TQuasiquoteNode.Create(const AExpression: IAstNode; const AIdentity: IAstIdentity); +begin + inherited Create(AIdentity); + FExpression := AExpression; +end; + +function TQuasiquoteNode.GetKind: TAstNodeKind; +begin + Result := akQuasiquote; +end; +function TQuasiquoteNode.GetExpression: IAstNode; +begin + Result := FExpression; +end; +function TQuasiquoteNode.AsQuasiquote: IQuasiquoteNode; +begin + Result := Self; +end; + +{ TUnquoteNode } + +constructor TUnquoteNode.Create(const AExpression: IAstNode; const AIdentity: IAstIdentity); +begin + inherited Create(AIdentity); + FExpression := AExpression; +end; + +function TUnquoteNode.GetKind: TAstNodeKind; +begin + Result := akUnquote; +end; +function TUnquoteNode.GetExpression: IAstNode; +begin + Result := FExpression; +end; +function TUnquoteNode.AsUnquote: IUnquoteNode; +begin + Result := Self; +end; + +{ TUnquoteSplicingNode } + +constructor TUnquoteSplicingNode.Create(const AExpression: IQuasiquoteNode; const AIdentity: IAstIdentity); +begin + inherited Create(AIdentity); + FExpression := AExpression; +end; + +function TUnquoteSplicingNode.GetKind: TAstNodeKind; +begin + Result := akUnquoteSplicing; +end; +function TUnquoteSplicingNode.GetExpression: IQuasiquoteNode; +begin + Result := FExpression; +end; +function TUnquoteSplicingNode.AsUnquoteSplicing: IUnquoteSplicingNode; +begin + Result := Self; end; { TIndexerNode } @@ -1935,11 +1887,10 @@ begin FIndex := AIndex; end; -function TIndexerNode.AsIndexer: IIndexerNode; +function TIndexerNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akIndexer; end; - function TIndexerNode.GetBase: IAstNode; begin Result := FBase; @@ -1948,9 +1899,9 @@ function TIndexerNode.GetIndex: IAstNode; begin Result := FIndex; end; -function TIndexerNode.GetKind: TAstNodeKind; +function TIndexerNode.AsIndexer: IIndexerNode; begin - Result := akIndexer; + Result := Self; end; { TMemberAccessNode } @@ -1967,11 +1918,10 @@ begin FMember := AMember; end; -function TMemberAccessNode.AsMemberAccess: IMemberAccessNode; +function TMemberAccessNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akMemberAccess; end; - function TMemberAccessNode.GetBase: IAstNode; begin Result := FBase; @@ -1980,9 +1930,9 @@ function TMemberAccessNode.GetMember: IKeywordNode; begin Result := FMember; end; -function TMemberAccessNode.GetKind: TAstNodeKind; +function TMemberAccessNode.AsMemberAccess: IMemberAccessNode; begin - Result := akMemberAccess; + Result := Self; end; { TRecordLiteralNode } @@ -2001,11 +1951,10 @@ begin FGenericDef := AGenericDef; end; -function TRecordLiteralNode.AsRecordLiteral: IRecordLiteralNode; +function TRecordLiteralNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akRecordLiteral; end; - function TRecordLiteralNode.GetFields: ITupleNode; begin Result := FFields; @@ -2018,9 +1967,40 @@ function TRecordLiteralNode.GetScalarDefinition: IScalarRecordDefinition; begin Result := FScalarDef; end; -function TRecordLiteralNode.GetKind: TAstNodeKind; +function TRecordLiteralNode.AsRecordLiteral: IRecordLiteralNode; begin - Result := akRecordLiteral; + Result := Self; +end; + +{ TCreateSeriesNode } + +constructor TCreateSeriesNode.Create( + const ADefinitionNode: IAstNode; + const ARecordDefinition: IScalarRecordDefinition; + const AStaticType: IStaticType; + const AIdentity: IAstIdentity +); +begin + inherited Create(AStaticType, AIdentity); + FDefinitionNode := ADefinitionNode; + FRecordDefinition := ARecordDefinition; +end; + +function TCreateSeriesNode.GetKind: TAstNodeKind; +begin + Result := akCreateSeries; +end; +function TCreateSeriesNode.GetDefinitionNode: IAstNode; +begin + Result := FDefinitionNode; +end; +function TCreateSeriesNode.GetRecordDefinition: IScalarRecordDefinition; +begin + Result := FRecordDefinition; +end; +function TCreateSeriesNode.AsCreateSeries: ICreateSeriesNode; +begin + Result := Self; end; { TAddSeriesItemNode } @@ -2038,11 +2018,10 @@ begin FLookback := ALookback; end; -function TAddSeriesItemNode.AsAddSeriesItem: IAddSeriesItemNode; +function TAddSeriesItemNode.GetKind: TAstNodeKind; begin - Result := Self; + Result := akAddSeriesItem; end; - function TAddSeriesItemNode.GetSeries: IIdentifierNode; begin Result := FSeries; @@ -2055,9 +2034,9 @@ function TAddSeriesItemNode.GetLookback: IAstNode; begin Result := FLookback; end; -function TAddSeriesItemNode.GetKind: TAstNodeKind; +function TAddSeriesItemNode.AsAddSeriesItem: IAddSeriesItemNode; begin - Result := akAddSeriesItem; + Result := Self; end; { TSeriesLengthNode } @@ -2068,18 +2047,38 @@ begin FSeries := ASeries; end; +function TSeriesLengthNode.GetKind: TAstNodeKind; +begin + Result := akSeriesLength; +end; +function TSeriesLengthNode.GetSeries: IIdentifierNode; +begin + Result := FSeries; +end; function TSeriesLengthNode.AsSeriesLength: ISeriesLengthNode; begin Result := Self; end; -function TSeriesLengthNode.GetSeries: IIdentifierNode; +{ TRecurNode } + +constructor TRecurNode.Create(const AArguments: ITupleNode; const AStaticType: IStaticType; const AIdentity: IAstIdentity); begin - Result := FSeries; + inherited Create(AStaticType, AIdentity); + FArguments := AArguments; end; -function TSeriesLengthNode.GetKind: TAstNodeKind; + +function TRecurNode.GetKind: TAstNodeKind; begin - Result := akSeriesLength; + Result := akRecur; +end; +function TRecurNode.GetArguments: ITupleNode; +begin + Result := FArguments; +end; +function TRecurNode.AsRecur: IRecurNode; +begin + Result := Self; end; { TNopNode } @@ -2089,15 +2088,14 @@ begin inherited Create(AStaticType, AIdentity); end; -function TNopNode.AsNop: INopNode; -begin - Result := Self; -end; - function TNopNode.GetKind: TAstNodeKind; begin Result := akNop; end; +function TNopNode.AsNop: INopNode; +begin + Result := Self; +end; { TPipeNode } @@ -2113,24 +2111,21 @@ begin FTransformation := ATransformation; end; +function TPipeNode.GetKind: TAstNodeKind; +begin + Result := akPipe; +end; +function TPipeNode.GetInputs: ITupleNode; +begin + Result := FInputs; +end; +function TPipeNode.GetTransformation: ILambdaExpressionNode; +begin + Result := FTransformation; +end; function TPipeNode.AsPipe: IPipeNode; begin Result := Self; end; -function TPipeNode.GetInputs: ITupleNode; -begin - Result := FInputs; -end; - -function TPipeNode.GetKind: TAstNodeKind; -begin - Result := akPipe; -end; - -function TPipeNode.GetTransformation: ILambdaExpressionNode; -begin - Result := FTransformation; -end; - end. diff --git a/Src/AST/Myc.Ast.RTL.Core.pas b/Src/AST/Myc.Ast.RTL.Core.pas index a86041b..15ebeed 100644 --- a/Src/AST/Myc.Ast.RTL.Core.pas +++ b/Src/AST/Myc.Ast.RTL.Core.pas @@ -3,7 +3,7 @@ unit Myc.Ast.RTL.Core; interface uses - System.SysUtils, + system.sysutils, Myc.Utils, Myc.Data.Scalar, Myc.Data.Value, @@ -11,140 +11,184 @@ uses Myc.Ast.Attributes; type - // Contains the "pure" native implementations. + { Contains the native implementations for the Myc standard library. } TRtlFunctions = record public - // Arithmetic + // --- Arithmetic --- + [TRtlExport('+', Pure)] [AstDoc('Adds two numbers or concatenates two strings.')] + [AstSignature('(number, number) -> number')] + [AstSignature('(string, string) -> string')] class function Add(const Args: TArray): TDataValue; overload; static; [TRtlExport('-', Pure)] [AstDoc('Subtracts B from A, or negates A if called with one argument.')] + [AstSignature('(number, number) -> number')] + [AstSignature('(number) -> number')] class function Subtract(const Args: TArray): TDataValue; static; [TRtlExport('*', Pure)] [AstDoc('Multiplies two numbers.')] + [AstSignature('(number, number) -> number')] class function Multiply(const Args: TArray): TDataValue; static; [TRtlExport('/', Pure)] - [AstDoc('Divides A by B. Returns a Float.')] + [AstDoc('Divides A by B. Always returns a floating point number.')] + [AstSignature('(number, number) -> number')] class function Divide(const Args: TArray): TDataValue; static; [TRtlExport('div', Pure)] - [AstDoc('Integer division.')] + [AstDoc('Performs integer division.')] + [AstSignature('(number, number) -> number')] class function IntDivide(const Args: TArray): TDataValue; static; [TRtlExport('mod', Pure)] - [AstDoc('Remainder of integer division.')] + [AstDoc('Returns the remainder of integer division.')] + [AstSignature('(number, number) -> number')] class function Modulus(const Args: TArray): TDataValue; static; - // Comparison + // --- Comparison --- + [TRtlExport('=', Pure)] - [AstDoc('Returns true if A equals B.')] + [AstDoc('Checks if A is equal to B.')] + [AstSignature('(any, any) -> boolean')] class function Equal(const Args: TArray): TDataValue; static; [TRtlExport('<>', Pure)] - [AstDoc('Returns true if A is not equal to B.')] + [AstDoc('Checks if A is not equal to B.')] + [AstSignature('(any, any) -> boolean')] class function NotEqual(const Args: TArray): TDataValue; static; [TRtlExport('<', Pure)] - [AstDoc('Returns true if A is less than B.')] + [AstDoc('Checks if A is less than B.')] + [AstSignature('(number, number) -> boolean')] class function LessThan(const Args: TArray): TDataValue; static; [TRtlExport('<=', Pure)] - [AstDoc('Returns true if A is less than or equal to B.')] + [AstDoc('Checks if A is less than or equal to B.')] + [AstSignature('(number, number) -> boolean')] class function LessThanOrEqual(const Args: TArray): TDataValue; static; [TRtlExport('>', Pure)] - [AstDoc('Returns true if A is greater than B.')] + [AstDoc('Checks if A is greater than B.')] + [AstSignature('(number, number) -> boolean')] class function GreaterThan(const Args: TArray): TDataValue; static; [TRtlExport('>=', Pure)] - [AstDoc('Returns true if A is greater than or equal to B.')] + [AstDoc('Checks if A is greater than or equal to B.')] + [AstSignature('(number, number) -> boolean')] class function GreaterThanOrEqual(const Args: TArray): TDataValue; static; - // Logic / Bitwise + // --- Logic / Bitwise --- + [TRtlExport('not', Pure)] - [AstDoc('Logical or bitwise NOT.')] + [AstDoc('Logical or bitwise NOT operation.')] + [AstSignature('(boolean) -> boolean')] + [AstSignature('(number) -> number')] class function LogicalNot(const Args: TArray): TDataValue; static; [TRtlExport('and', Pure)] - [AstDoc('Logical or bitwise AND.')] + [AstDoc('Logical or bitwise AND operation.')] + [AstSignature('(boolean, boolean) -> boolean')] + [AstSignature('(number, number) -> number')] class function BitwiseAnd(const Args: TArray): TDataValue; static; [TRtlExport('or', Pure)] - [AstDoc('Logical or bitwise OR.')] + [AstDoc('Logical or bitwise OR operation.')] + [AstSignature('(boolean, boolean) -> boolean')] + [AstSignature('(number, number) -> number')] class function BitwiseOr(const Args: TArray): TDataValue; static; [TRtlExport('xor', Pure)] - [AstDoc('Logical or bitwise XOR.')] + [AstDoc('Logical or bitwise XOR operation.')] + [AstSignature('(boolean, boolean) -> boolean')] + [AstSignature('(number, number) -> number')] class function BitwiseXor(const Args: TArray): TDataValue; static; [TRtlExport('shl', Pure)] [AstDoc('Bitwise shift left.')] + [AstSignature('(number, number) -> number')] class function LeftShift(const Args: TArray): TDataValue; static; [TRtlExport('shr', Pure)] [AstDoc('Bitwise shift right.')] + [AstSignature('(number, number) -> number')] class function RightShift(const Args: TArray): TDataValue; static; - // Math Functions + // --- Math Functions --- + [TRtlExport('Abs', Pure)] - [AstDoc('Returns the absolute value.')] + [AstDoc('Returns the absolute value of a number.')] + [AstSignature('(number) -> number')] class function Abs(const Arg: TScalar): TScalar; static; [TRtlExport('Round', Pure)] [AstDoc('Rounds a float to the nearest integer.')] + [AstSignature('(number) -> number')] class function Round(const Arg: TScalar): TScalar; static; [TRtlExport('Trunc', Pure)] - [AstDoc('Truncates a float to an integer.')] + [AstDoc('Returns the integer part of a float.')] + [AstSignature('(number) -> number')] class function Trunc(const Arg: TScalar): TScalar; static; [TRtlExport('Ceil', Pure)] - [AstDoc('Returns the smallest integer greater than or equal to the argument.')] + [AstDoc('Returns the smallest integer >= the argument.')] + [AstSignature('(number) -> number')] class function Ceil(const Arg: TScalar): TScalar; static; [TRtlExport('Floor', Pure)] - [AstDoc('Returns the largest integer less than or equal to the argument.')] + [AstDoc('Returns the largest integer <= the argument.')] + [AstSignature('(number) -> number')] class function Floor(const Arg: TScalar): TScalar; static; [TRtlExport('Sign', Pure)] - [AstDoc('Returns -1 for negative numbers, 1 for positive numbers, and 0 for zero.')] + [AstDoc('Returns -1 for negative, 1 for positive, 0 for zero.')] + [AstSignature('(number) -> number')] class function Sign(const Arg: TScalar): TScalar; static; - // DateTime + // --- DateTime --- + [TRtlExport('Now', Impure)] - [AstDoc('Returns the current system date and time.')] + [AstDoc('Returns the current system timestamp.')] + [AstSignature('() -> datetime')] class function Now(const Args: TArray): TDataValue; static; [TRtlExport('Date', Impure)] - [AstDoc('Returns the current date or constructs a date from (Year, Month, Day).')] + [AstDoc('Returns the current date or constructs a date from Y, M, D.')] + [AstSignature('() -> datetime')] + [AstSignature('(number, number, number) -> datetime')] class function Date(const Args: TArray): TDataValue; static; - // High-Order / Series + // --- Functional / Series --- + [TRtlExport('Memoize', Pure)] - [AstDoc('Returns a memoized version of the provided function.')] + [AstDoc('Creates a memoized version of a function for performance.')] + [AstSignature('((any) -> any) -> ((any) -> any)')] class function Memoize(const Args: TArray): TDataValue; static; [TRtlExport('Map', Pure)] - [AstDoc('Maps a function over a series.')] + [AstDoc('Applies a function to every element of a series.')] + [AstSignature('(series, (any) -> any) -> series')] class function Map(const Args: TArray): TDataValue; static; [TRtlExport('Reduce', Pure)] - [AstDoc('Reduces a series using a combining function and an accumulator.')] + [AstDoc('Collapses a series into a single value using a reducer function.')] + [AstSignature('(series, any, (any, any) -> any) -> any')] class function Reduce(const Args: TArray): TDataValue; static; [TRtlExport('Where', Pure)] - [AstDoc('Filters a series using a predicate function.')] + [AstDoc('Filters a series based on a predicate function.')] + [AstSignature('(series, (any) -> boolean) -> series')] class function Where(const Args: TArray): TDataValue; static; [TRtlExport('Any', Pure)] - [AstDoc('Returns true if any element in the series satisfies the predicate.')] + [AstDoc('Returns true if at least one element satisfies the predicate.')] + [AstSignature('(series, (any) -> boolean) -> boolean')] class function Any(const Args: TArray): TDataValue; static; - // --- Static Specializations (Picked up by TRtlRegistry via attributes) --- + // --- Static Specializations (Targets for TypeChecker/Specializer) --- [TRtlExport('+', Pure)] class function Add_Ordinal_Ordinal_Ordinal(A, B: Int64): Int64; static; @@ -155,7 +199,7 @@ type [TRtlExport('+', Pure)] class function Add_Float_Ordinal_Float(A: Double; B: Int64): Double; static; [TRtlExport('+', Pure)] - class function Add_Text_Text_Text(const A: String; const B: String): String; static; + class function Add_Text_Text_Text(const A: string; const B: string): string; static; [TRtlExport('-', Pure)] class function Subtract_Ordinal_Ordinal_Ordinal(A, B: Int64): Int64; static;