From a4afae6f39f4be63b9d62c70ba38219edec75c1f Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Sun, 4 Jan 2026 17:06:59 +0100 Subject: [PATCH] Tuples --- ASTPlayground/ASTPlayground.delphilsp.json | 2 +- ASTPlayground/MainForm.pas | 8 +- Doc/Tupel 1.md | 4 - Src/AST/Myc.Ast.Compiler.Specializer.pas | 2 +- Src/AST/Myc.Ast.Compiler.TypeChecker.pas | 22 +- Src/AST/Myc.Ast.Evaluator.pas | 2 +- Src/AST/Myc.Ast.RTL.Core.pas | 1 - Src/AST/Myc.Ast.Types.pas | 781 ++++++++++++++++----- Src/Data/Myc.Data.Value.pas | 38 +- Test/AST/Test.Myc.Ast.RTL.TypeRegistry.pas | 6 +- 10 files changed, 655 insertions(+), 211 deletions(-) diff --git a/ASTPlayground/ASTPlayground.delphilsp.json b/ASTPlayground/ASTPlayground.delphilsp.json index cd8450f..5348c6a 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.Handlers", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.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": false, "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.Handlers", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.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 diff --git a/ASTPlayground/MainForm.pas b/ASTPlayground/MainForm.pas index c87a833..3783260 100644 --- a/ASTPlayground/MainForm.pas +++ b/ASTPlayground/MainForm.pas @@ -840,7 +840,7 @@ begin var lastClose := 1000.0; Randomize; var recDef := TRttiAstHelper.JsonToRecordDefinition(TRttiAstHelper.RecordDefinitionToJson); - var series := TDataValue.FromRecordSeries(TScalarRecordSeries.Create(recDef)); + var series := TScalarRecordSeries.Create(recDef) as IWriteableScalarRecordSeries; var nw := Now; var ohlcvRec: TOHLCV; for var i := 1 to numRecs do @@ -862,9 +862,9 @@ begin values[5].AsInt64 := ohlcvRec.Volume; recordValue := TScalarRecord.Create(recDef, values); - series.AsRecordSeries.Add(recordValue, lookback); + series.Add(recordValue, lookback); - if series.AsRecordSeries.TotalCount >= smaSlowLength then + if series.TotalCount >= smaSlowLength then begin env.RootScope[seriesAddress] := series; @@ -1111,7 +1111,7 @@ begin var testEnv := FEnvironment.CreateEnvironment; - testEnv.RootScope.Define('ohlcvSeries', TDataValue.FromRecordSeries(series)); + testEnv.RootScope.Define('ohlcvSeries', series); ast := TAst.LambdaExpr( diff --git a/Doc/Tupel 1.md b/Doc/Tupel 1.md index 1ae15ba..9f1dbf9 100644 --- a/Doc/Tupel 1.md +++ b/Doc/Tupel 1.md @@ -121,7 +121,3 @@ Die Matrix-Invariante erfordert exakt gleiche Formen der Unterelemente. * Konsolidierung von `IArgumentList`, `IParameterList` etc. zu einer allgemeinen Tupel-Repräsentation. - ---- - -Soll ich nun mit der Implementierung der Typ-Erweiterungen in `Myc.Ast.Types.pas` beginnen? \ No newline at end of file diff --git a/Src/AST/Myc.Ast.Compiler.Specializer.pas b/Src/AST/Myc.Ast.Compiler.Specializer.pas index 9bd01fc..3311f12 100644 --- a/Src/AST/Myc.Ast.Compiler.Specializer.pas +++ b/Src/AST/Myc.Ast.Compiler.Specializer.pas @@ -248,7 +248,7 @@ begin raise ESpecializerException.CreateFmt('Internal Error: Failed to compile specialization for "%s"', [funcName]); // 6b. Store in cache - var returnType := compiled.StaticType.Signatures[0].ReturnType; + var returnType := compiled.StaticType.AsMethod.Signatures[0].ReturnType; specializedMethod := TSpecializedMethod.Create(compiled.Func, returnType, compiled.IsPure); FMonomorphCache.Add(key, specializedMethod); diff --git a/Src/AST/Myc.Ast.Compiler.TypeChecker.pas b/Src/AST/Myc.Ast.Compiler.TypeChecker.pas index df63242..34e19b7 100644 --- a/Src/AST/Myc.Ast.Compiler.TypeChecker.pas +++ b/Src/AST/Myc.Ast.Compiler.TypeChecker.pas @@ -542,7 +542,7 @@ begin if not hasUnknownArgs then begin bestSig := nil; - for var sig in calleeType.Signatures do + for var sig in calleeType.AsMethod.Signatures do begin if Length(sig.ParamTypes) <> Length(argTypes) then continue; @@ -603,9 +603,9 @@ begin elemType := TTypes.Unknown; if baseType.Kind = stSeries then - elemType := baseType.ElementType + elemType := baseType.AsSeries.ElementType else if baseType.Kind = stRecordSeries then - elemType := TTypes.CreateRecord(baseType.Definition); + elemType := TTypes.CreateRecord(baseType.AsRecord.Definition); elemType := ApplyOptionality(elemType, isOpt); Result := TAst.Indexer(Node.Identity, newBase, newIndex, elemType); @@ -626,10 +626,10 @@ begin if (baseType.Kind = stRecord) or (baseType.Kind = stRecordSeries) then begin - idx := baseType.Definition.IndexOf(M.Member.Value); + idx := baseType.AsRecord.Definition.IndexOf(M.Member.Value); if idx >= 0 then begin - var fieldType := TTypes.FromScalarKind(baseType.Definition[idx]); + var fieldType := TTypes.FromScalarKind(baseType.AsRecord.Definition[idx]); if baseType.Kind = stRecordSeries then resType := TTypes.CreateSeries(fieldType) else @@ -768,7 +768,7 @@ begin else if (sourceType.Kind = stRecordSeries) then begin // 2. Verify Selectors exist in Record Definition - var def := sourceType.Definition; + var def := sourceType.AsRecord.Definition; for var sel in P.Selectors do begin if def.IndexOf(sel.Value) < 0 then @@ -816,7 +816,7 @@ begin if streamType.Kind = stRecordSeries then begin // Extract field type from definition - var def := streamType.Definition; + var def := streamType.AsRecord.Definition; var idx := def.IndexOf(sel.Value); if idx >= 0 then inferredType := TTypes.FromScalarKind(def[idx]); @@ -824,8 +824,8 @@ begin else if streamType.Kind = stSeries then begin // If simple series, use its element type - if Assigned(streamType.ElementType) then - inferredType := streamType.ElementType + if Assigned(streamType.AsSeries.ElementType) then + inferredType := streamType.AsSeries.ElementType else inferredType := TTypes.Ordinal; // Fallback default end; @@ -879,13 +879,13 @@ begin var typedLambda := Accept(preTypedLambda).AsLambdaExpression; // 4. Infer Pipe Return Type & Validate Strictness - var lambdaRetType := typedLambda.AsTypedNode.StaticType.Signatures[0].ReturnType; + var lambdaRetType := typedLambda.AsTypedNode.StaticType.AsMethod.Signatures[0].ReturnType; var pipeType: IStaticType; if lambdaRetType.Kind = stRecord then begin // Valid: Record -> RecordSeries - pipeType := TTypes.CreateRecordSeries(lambdaRetType.Definition); + pipeType := TTypes.CreateRecordSeries(lambdaRetType.AsRecord.Definition); end else begin diff --git a/Src/AST/Myc.Ast.Evaluator.pas b/Src/AST/Myc.Ast.Evaluator.pas index 549b037..6aa51c1 100644 --- a/Src/AST/Myc.Ast.Evaluator.pas +++ b/Src/AST/Myc.Ast.Evaluator.pas @@ -446,7 +446,7 @@ begin end; end; lambdaFunc := Visit(N.Transformation).AsMethod(); - var outputDef := N.StaticType.Definition; + var outputDef := N.StaticType.AsRecord.Definition; var pipeAdapter: TPipeStream.TPipeLambda := function(const S: array of ISeries; out R: array of TScalar.TValue): Boolean var diff --git a/Src/AST/Myc.Ast.RTL.Core.pas b/Src/AST/Myc.Ast.RTL.Core.pas index 8bdfb77..00a5648 100644 --- a/Src/AST/Myc.Ast.RTL.Core.pas +++ b/Src/AST/Myc.Ast.RTL.Core.pas @@ -588,7 +588,6 @@ var predicateResult: TDataValue; indexSeries: ISeries; mapperFunc: TDataValue.TFunc; - finalSeries: ISeries; begin if Length(Args) <> 2 then raise EArgumentException.Create('Where requires exactly two arguments: a series and a predicate function.'); diff --git a/Src/AST/Myc.Ast.Types.pas b/Src/AST/Myc.Ast.Types.pas index 2a78f44..cf30296 100644 --- a/Src/AST/Myc.Ast.Types.pas +++ b/Src/AST/Myc.Ast.Types.pas @@ -10,7 +10,15 @@ uses Myc.Data.Keyword; type + // Forward declarations IStaticType = interface; + ITupleType = interface; + IVectorType = interface; + IMatrixType = interface; + ISeriesType = interface; + IMethodType = interface; + IRecordType = interface; + IGenericRecordType = interface; TStaticTypeKind = ( stUnknown, @@ -25,7 +33,11 @@ type stSeries, stRecord, stRecordSeries, - stGenericRecord + stGenericRecord, + // New N-dimensional types + stTuple, + stVector, + stMatrix ); TStaticTypeKindHelper = record helper for TStaticTypeKind @@ -46,29 +58,94 @@ type IGenericRecordDefinition = IKeywordMapping; TGenericRecordRegistry = TKeywordMappingRegistry; + IScalarRecordDefinition = Myc.Data.Scalar.IScalarRecordDefinition; + + // Base Interface IStaticType = interface {$region 'private'} function GetKind: TStaticTypeKind; function GetIsOptional: Boolean; - function GetElementType: IStaticType; - function GetSignatures: TArray; - function GetDefinition: IScalarRecordDefinition; - function GetGenericDefinition: IGenericRecordDefinition; + function GetIsScalarPure: Boolean; {$endregion} property Kind: TStaticTypeKind read GetKind; property IsOptional: Boolean read GetIsOptional; - property ElementType: IStaticType read GetElementType; - property Signatures: TArray read GetSignatures; - property Definition: IScalarRecordDefinition read GetDefinition; - property GenericDefinition: IGenericRecordDefinition read GetGenericDefinition; + property IsScalarPure: Boolean read GetIsScalarPure; function IsEqual(const Other: IStaticType): Boolean; function IsStructurallyEqual(const Other: IStaticType): Boolean; function ToString: string; function GetHashCode: Integer; + + // Hard casts to specialized interfaces + function AsTuple: ITupleType; + function AsVector: IVectorType; + function AsMatrix: IMatrixType; + function AsSeries: ISeriesType; + function AsMethod: IMethodType; + function AsRecord: IRecordType; + function AsGenericRecord: IGenericRecordType; end; + // --- Specialized Interfaces --- + + ITupleType = interface(IStaticType) + {$region 'private'} + function GetElements: TArray; + function GetCount: Integer; + {$endregion} + property Elements: TArray read GetElements; + property Count: Integer read GetCount; + end; + + IVectorType = interface(IStaticType) + {$region 'private'} + function GetElementType: IStaticType; + function GetCount: Integer; + {$endregion} + property ElementType: IStaticType read GetElementType; + property Count: Integer read GetCount; + end; + + IMatrixType = interface(IStaticType) + {$region 'private'} + function GetElementType: IStaticType; + function GetDimensions: TArray; + {$endregion} + property ElementType: IStaticType read GetElementType; + property Dimensions: TArray read GetDimensions; + end; + + ISeriesType = interface(IStaticType) + {$region 'private'} + function GetElementType: IStaticType; + {$endregion} + property ElementType: IStaticType read GetElementType; + end; + + IMethodType = interface(IStaticType) + {$region 'private'} + function GetSignatures: TArray; + {$endregion} + property Signatures: TArray read GetSignatures; + end; + + IRecordType = interface(IStaticType) + {$region 'private'} + function GetDefinition: IScalarRecordDefinition; + {$endregion} + property Definition: IScalarRecordDefinition read GetDefinition; + end; + + IGenericRecordType = interface(IStaticType) + {$region 'private'} + function GetGenericDefinition: IGenericRecordDefinition; + {$endregion} + property GenericDefinition: IGenericRecordDefinition read GetGenericDefinition; + end; + + // --- Factory --- + TTypes = record private class var @@ -140,6 +217,10 @@ type class function CreateRecordSeries(const ADef: IScalarRecordDefinition): IStaticType; static; class function CreateGenericRecord(const ADef: IGenericRecordDefinition): IStaticType; static; + class function CreateTuple(const AElements: TArray): ITupleType; static; + class function CreateVector(const AElementType: IStaticType; ACount: Integer): IVectorType; static; + class function CreateMatrix(const AElementType: IStaticType; const ADimensions: TArray): IMatrixType; static; + class function MakeOptional(const AType: IStaticType): IStaticType; static; class function Unwrap(const AType: IStaticType): IStaticType; static; class function FromScalarKind(AKind: TScalar.TKind): IStaticType; static; @@ -167,7 +248,7 @@ type implementation uses - System.Hash; // Critical for robust hash calculations + System.Hash; { TStaticTypeKindHelper } @@ -187,6 +268,9 @@ begin stRecord: Result := 'Record'; stRecordSeries: Result := 'RecordSeries'; stGenericRecord: Result := 'GenericRecord'; + stTuple: Result := 'Tuple'; + stVector: Result := 'Vector'; + stMatrix: Result := 'Matrix'; else Result := 'ErrorType'; end; @@ -199,14 +283,19 @@ type protected function GetKind: TStaticTypeKind; virtual; abstract; function GetIsOptional: Boolean; virtual; - function GetElementType: IStaticType; virtual; - function GetSignatures: TArray; virtual; - function GetDefinition: IScalarRecordDefinition; virtual; - function GetGenericDefinition: IGenericRecordDefinition; virtual; + function GetIsScalarPure: Boolean; virtual; function IsEqual(const Other: IStaticType): Boolean; virtual; function IsStructurallyEqual(const Other: IStaticType): Boolean; virtual; function GetHashCode: Integer; override; abstract; function ToString: string; override; + + function AsTuple: ITupleType; virtual; + function AsVector: IVectorType; virtual; + function AsMatrix: IMatrixType; virtual; + function AsSeries: ISeriesType; virtual; + function AsMethod: IMethodType; virtual; + function AsRecord: IRecordType; virtual; + function AsGenericRecord: IGenericRecordType; virtual; end; function TAbstractStaticType.GetIsOptional: Boolean; @@ -214,24 +303,9 @@ begin Result := False; end; -function TAbstractStaticType.GetElementType: IStaticType; +function TAbstractStaticType.GetIsScalarPure: Boolean; begin - Result := nil; -end; - -function TAbstractStaticType.GetSignatures: TArray; -begin - Result := nil; -end; - -function TAbstractStaticType.GetDefinition: IScalarRecordDefinition; -begin - Result := Default(IScalarRecordDefinition); -end; - -function TAbstractStaticType.GetGenericDefinition: IGenericRecordDefinition; -begin - Result := nil; + Result := False; end; function TAbstractStaticType.IsStructurallyEqual(const Other: IStaticType): Boolean; @@ -255,6 +329,36 @@ begin Result := GetKind.ToString; end; +// Cast Defaults +function TAbstractStaticType.AsTuple: ITupleType; +begin + raise EInvalidCast.Create('Type is not a Tuple.'); +end; +function TAbstractStaticType.AsVector: IVectorType; +begin + raise EInvalidCast.Create('Type is not a Vector.'); +end; +function TAbstractStaticType.AsMatrix: IMatrixType; +begin + raise EInvalidCast.Create('Type is not a Matrix.'); +end; +function TAbstractStaticType.AsSeries: ISeriesType; +begin + raise EInvalidCast.Create('Type is not a Series.'); +end; +function TAbstractStaticType.AsMethod: IMethodType; +begin + raise EInvalidCast.Create('Type is not a Method.'); +end; +function TAbstractStaticType.AsRecord: IRecordType; +begin + raise EInvalidCast.Create('Type is not a Record.'); +end; +function TAbstractStaticType.AsGenericRecord: IGenericRecordType; +begin + raise EInvalidCast.Create('Type is not a Generic Record.'); +end; + // --- Optional Type Decorator --- type @@ -265,14 +369,19 @@ type constructor Create(const AInner: IStaticType); function GetKind: TStaticTypeKind; function GetIsOptional: Boolean; - function GetElementType: IStaticType; - function GetSignatures: TArray; - function GetDefinition: IScalarRecordDefinition; - function GetGenericDefinition: IGenericRecordDefinition; + function GetIsScalarPure: Boolean; function IsStructurallyEqual(const Other: IStaticType): Boolean; function IsEqual(const Other: IStaticType): Boolean; function GetHashCode: Integer; override; function ToString: string; override; + + function AsTuple: ITupleType; + function AsVector: IVectorType; + function AsMatrix: IMatrixType; + function AsSeries: ISeriesType; + function AsMethod: IMethodType; + function AsRecord: IRecordType; + function AsGenericRecord: IGenericRecordType; end; constructor TOptionalType.Create(const AInner: IStaticType); @@ -291,24 +400,9 @@ begin Result := True; end; -function TOptionalType.GetElementType: IStaticType; +function TOptionalType.GetIsScalarPure: Boolean; begin - Result := FInner.ElementType; -end; - -function TOptionalType.GetSignatures: TArray; -begin - Result := FInner.Signatures; -end; - -function TOptionalType.GetDefinition: IScalarRecordDefinition; -begin - Result := FInner.Definition; -end; - -function TOptionalType.GetGenericDefinition: IGenericRecordDefinition; -begin - Result := FInner.GenericDefinition; + Result := False; end; function TOptionalType.IsStructurallyEqual(const Other: IStaticType): Boolean; @@ -330,10 +424,8 @@ var h: Integer; optionalMarker: Integer; begin - // We mix the Inner Hash with a constant marker using BobJenkins to ensure - // T and T? have distinct, uncorrelated hashes. h := FInner.GetHashCode; - optionalMarker := $11111111; // Arbitrary constant to signal "Optionality" + optionalMarker := $11111111; Result := THashBobJenkins.GetHashValue(optionalMarker, SizeOf(Integer), h); end; @@ -342,6 +434,36 @@ begin Result := FInner.ToString + '?'; end; +// Delegation +function TOptionalType.AsTuple: ITupleType; +begin + Result := FInner.AsTuple; +end; +function TOptionalType.AsVector: IVectorType; +begin + Result := FInner.AsVector; +end; +function TOptionalType.AsMatrix: IMatrixType; +begin + Result := FInner.AsMatrix; +end; +function TOptionalType.AsSeries: ISeriesType; +begin + Result := FInner.AsSeries; +end; +function TOptionalType.AsMethod: IMethodType; +begin + Result := FInner.AsMethod; +end; +function TOptionalType.AsRecord: IRecordType; +begin + Result := FInner.AsRecord; +end; +function TOptionalType.AsGenericRecord: IGenericRecordType; +begin + Result := FInner.AsGenericRecord; +end; + // --- Simple (Flyweight) Type Implementations --- type @@ -351,6 +473,7 @@ type public constructor Create(AKind: TStaticTypeKind); function GetKind: TStaticTypeKind; override; + function GetIsScalarPure: Boolean; override; function GetHashCode: Integer; override; end; @@ -365,6 +488,11 @@ begin Result := FKind; end; +function TSimpleStaticType.GetIsScalarPure: Boolean; +begin + Result := FKind in [stOrdinal, stFloat, stBoolean, stDateTime, stKeyword]; +end; + function TSimpleStaticType.GetHashCode: Integer; begin Result := THashBobJenkins.GetHashValue(FKind, SizeOf(TStaticTypeKind), 0); @@ -373,16 +501,17 @@ end; // --- Complex Type Implementations --- type - TSeriesType = class(TAbstractStaticType) + TSeriesType = class(TAbstractStaticType, ISeriesType) private FElementType: IStaticType; public constructor Create(AElementType: IStaticType); function GetKind: TStaticTypeKind; override; - function GetElementType: IStaticType; override; + function GetElementType: IStaticType; function IsStructurallyEqual(const Other: IStaticType): Boolean; override; function GetHashCode: Integer; override; function ToString: string; override; + function AsSeries: ISeriesType; override; end; constructor TSeriesType.Create(AElementType: IStaticType); @@ -401,20 +530,25 @@ begin Result := FElementType; end; +function TSeriesType.AsSeries: ISeriesType; +begin + Result := Self; +end; + function TSeriesType.IsStructurallyEqual(const Other: IStaticType): Boolean; begin var uOther := TTypes.Unwrap(Other); - Result := (uOther.Kind = stSeries) and (Self.FElementType.IsEqual(uOther.ElementType)); + if uOther.Kind <> stSeries then + exit(False); + Result := FElementType.IsEqual(uOther.AsSeries.ElementType); end; function TSeriesType.GetHashCode: Integer; var h: Integer; begin - // Seed with Kind, then mix in ElementType's hash h := Ord(stSeries); Result := THashBobJenkins.GetHashValue(h, SizeOf(TStaticTypeKind), 0); - if Assigned(FElementType) then begin h := FElementType.GetHashCode; @@ -427,61 +561,312 @@ begin Result := 'Series<' + FElementType.ToString + '>'; end; -{ TMethodSignature } +// --- Tuple --- -constructor TMethodSignature.Create(const AParamTypes: TArray; const AReturnType: IStaticType); +type + TTupleType = class(TAbstractStaticType, ITupleType) + private + FElements: TArray; + public + constructor Create(const AElements: TArray); + function GetKind: TStaticTypeKind; override; + function GetIsScalarPure: Boolean; override; + function GetElements: TArray; + function GetCount: Integer; + function IsStructurallyEqual(const Other: IStaticType): Boolean; override; + function GetHashCode: Integer; override; + function ToString: string; override; + function AsTuple: ITupleType; override; + end; + +constructor TTupleType.Create(const AElements: TArray); begin inherited Create; - FParamTypes := AParamTypes; - FReturnType := AReturnType; + FElements := AElements; end; -function TMethodSignature.GetParamTypes: TArray; +function TTupleType.GetKind: TStaticTypeKind; begin - Result := FParamTypes; + Result := stTuple; end; -function TMethodSignature.GetReturnType: IStaticType; +function TTupleType.GetIsScalarPure: Boolean; begin - Result := FReturnType; + for var elem in FElements do + if not elem.IsScalarPure then + exit(False); + Result := True; end; -function TMethodSignature.GetHashCode: Integer; +function TTupleType.GetElements: TArray; +begin + Result := FElements; +end; + +function TTupleType.GetCount: Integer; +begin + Result := Length(FElements); +end; + +function TTupleType.AsTuple: ITupleType; +begin + Result := Self; +end; + +function TTupleType.IsStructurallyEqual(const Other: IStaticType): Boolean; var - i, h: Integer; + otherTuple: ITupleType; + i: Integer; begin - // Start with 0 (or a signature constant), mix ReturnType, then Params - Result := 0; + var uOther := TTypes.Unwrap(Other); + if uOther.Kind <> stTuple then + exit(False); + otherTuple := uOther.AsTuple; - if Assigned(FReturnType) then + if Length(FElements) <> otherTuple.Count then + exit(False); + for i := 0 to High(FElements) do + if not FElements[i].IsEqual(otherTuple.Elements[i]) then + exit(False); + Result := True; +end; + +function TTupleType.GetHashCode: Integer; +var + h, i: Integer; +begin + h := Ord(stTuple); + Result := THashBobJenkins.GetHashValue(h, SizeOf(TStaticTypeKind), 0); + for i := 0 to High(FElements) do begin - h := FReturnType.GetHashCode; + h := FElements[i].GetHashCode; Result := THashBobJenkins.GetHashValue(h, SizeOf(Integer), Result); end; +end; - for i := 0 to High(FParamTypes) do - begin - if Assigned(FParamTypes[i]) then +function TTupleType.ToString: string; +var + sb: TStringBuilder; + i: Integer; +begin + sb := TStringBuilder.Create; + try + sb.Append('('); + for i := 0 to High(FElements) do begin - h := FParamTypes[i].GetHashCode; - Result := THashBobJenkins.GetHashValue(h, SizeOf(Integer), Result); + sb.Append(FElements[i].ToString); + if i < High(FElements) then + sb.Append(', '); end; + sb.Append(')'); + Result := sb.ToString; + finally + sb.Free; end; end; -// --- +// --- Vector --- + type - TMethodType = class(TAbstractStaticType) + TVectorType = class(TAbstractStaticType, IVectorType) + private + FElementType: IStaticType; + FCount: Integer; + public + constructor Create(const AElementType: IStaticType; ACount: Integer); + function GetKind: TStaticTypeKind; override; + function GetIsScalarPure: Boolean; override; + function GetElementType: IStaticType; + function GetCount: Integer; + function IsStructurallyEqual(const Other: IStaticType): Boolean; override; + function GetHashCode: Integer; override; + function ToString: string; override; + function AsVector: IVectorType; override; + end; + +constructor TVectorType.Create(const AElementType: IStaticType; ACount: Integer); +begin + inherited Create; + FElementType := AElementType; + FCount := ACount; +end; + +function TVectorType.GetKind: TStaticTypeKind; +begin + Result := stVector; +end; + +function TVectorType.GetIsScalarPure: Boolean; +begin + Result := FElementType.IsScalarPure; +end; + +function TVectorType.GetElementType: IStaticType; +begin + Result := FElementType; +end; + +function TVectorType.GetCount: Integer; +begin + Result := FCount; +end; + +function TVectorType.AsVector: IVectorType; +begin + Result := Self; +end; + +function TVectorType.IsStructurallyEqual(const Other: IStaticType): Boolean; +var + otherVec: IVectorType; +begin + var uOther := TTypes.Unwrap(Other); + if uOther.Kind <> stVector then + exit(False); + otherVec := uOther.AsVector; + Result := (FCount = otherVec.Count) and (FElementType.IsEqual(otherVec.ElementType)); +end; + +function TVectorType.GetHashCode: Integer; +var + h: Integer; +begin + h := Ord(stVector); + Result := THashBobJenkins.GetHashValue(h, SizeOf(TStaticTypeKind), 0); + h := FElementType.GetHashCode; + Result := THashBobJenkins.GetHashValue(h, SizeOf(Integer), Result); + Result := THashBobJenkins.GetHashValue(FCount, SizeOf(Integer), Result); +end; + +function TVectorType.ToString: string; +begin + Result := Format('[%s; %d]', [FElementType.ToString, FCount]); +end; + +// --- Matrix --- + +type + TMatrixType = class(TAbstractStaticType, IMatrixType) + private + FElementType: IStaticType; + FDimensions: TArray; + public + constructor Create(const AElementType: IStaticType; const ADimensions: TArray); + function GetKind: TStaticTypeKind; override; + function GetIsScalarPure: Boolean; override; + function GetElementType: IStaticType; + function GetDimensions: TArray; + function IsStructurallyEqual(const Other: IStaticType): Boolean; override; + function GetHashCode: Integer; override; + function ToString: string; override; + function AsMatrix: IMatrixType; override; + end; + +constructor TMatrixType.Create(const AElementType: IStaticType; const ADimensions: TArray); +begin + inherited Create; + FElementType := AElementType; + FDimensions := ADimensions; +end; + +function TMatrixType.GetKind: TStaticTypeKind; +begin + Result := stMatrix; +end; + +function TMatrixType.GetIsScalarPure: Boolean; +begin + Result := FElementType.IsScalarPure; +end; + +function TMatrixType.GetElementType: IStaticType; +begin + Result := FElementType; +end; + +function TMatrixType.GetDimensions: TArray; +begin + Result := FDimensions; +end; + +function TMatrixType.AsMatrix: IMatrixType; +begin + Result := Self; +end; + +function TMatrixType.IsStructurallyEqual(const Other: IStaticType): Boolean; +var + otherMat: IMatrixType; + i: Integer; + dims: TArray; +begin + var uOther := TTypes.Unwrap(Other); + if uOther.Kind <> stMatrix then + exit(False); + otherMat := uOther.AsMatrix; + + if not FElementType.IsEqual(otherMat.ElementType) then + exit(False); + + dims := otherMat.Dimensions; + if Length(FDimensions) <> Length(dims) then + exit(False); + for i := 0 to High(FDimensions) do + if FDimensions[i] <> dims[i] then + exit(False); + Result := True; +end; + +function TMatrixType.GetHashCode: Integer; +var + h, i: Integer; +begin + h := Ord(stMatrix); + Result := THashBobJenkins.GetHashValue(h, SizeOf(TStaticTypeKind), 0); + h := FElementType.GetHashCode; + Result := THashBobJenkins.GetHashValue(h, SizeOf(Integer), Result); + for i := 0 to High(FDimensions) do + Result := THashBobJenkins.GetHashValue(FDimensions[i], SizeOf(Integer), Result); +end; + +function TMatrixType.ToString: string; +var + sb: TStringBuilder; + i: Integer; +begin + sb := TStringBuilder.Create; + try + sb.Append('['); + sb.Append(FElementType.ToString); + sb.Append('; '); + for i := 0 to High(FDimensions) do + begin + sb.Append(FDimensions[i]); + if i < High(FDimensions) then + sb.Append('x'); + end; + sb.Append(']'); + Result := sb.ToString; + finally + sb.Free; + end; +end; + +// --- Method Type --- + +type + TMethodType = class(TAbstractStaticType, IMethodType) private FSignatures: TArray; function SignatureToString(const Sig: IMethodSignature): string; public constructor Create(const ASignatures: TArray); function GetKind: TStaticTypeKind; override; - function GetSignatures: TArray; override; + function GetSignatures: TArray; function IsStructurallyEqual(const Other: IStaticType): Boolean; override; function GetHashCode: Integer; override; function ToString: string; override; + function AsMethod: IMethodType; override; end; constructor TMethodType.Create(const ASignatures: TArray); @@ -501,6 +886,11 @@ begin Result := FSignatures; end; +function TMethodType.AsMethod: IMethodType; +begin + Result := Self; +end; + function TMethodType.SignatureToString(const Sig: IMethodSignature): string; var i: Integer; @@ -518,45 +908,39 @@ end; function TMethodType.IsStructurallyEqual(const Other: IStaticType): Boolean; var + otherMeth: IMethodType; i, j: Integer; + s1, s2: IMethodSignature; begin var uOther := TTypes.Unwrap(Other); - if (not Assigned(uOther)) or (uOther.Kind <> stMethod) then + if uOther.Kind <> stMethod then exit(False); + otherMeth := uOther.AsMethod; - var otherSigs := uOther.Signatures; - if Length(Self.FSignatures) <> Length(otherSigs) then + if Length(FSignatures) <> Length(otherMeth.Signatures) then exit(False); - - for i := 0 to High(Self.FSignatures) do + for i := 0 to High(FSignatures) do begin - var sig1 := Self.FSignatures[i]; - var sig2 := otherSigs[i]; - - if not sig1.ReturnType.IsEqual(sig2.ReturnType) then + s1 := FSignatures[i]; + s2 := otherMeth.Signatures[i]; + if not s1.ReturnType.IsEqual(s2.ReturnType) then exit(False); - if Length(sig1.ParamTypes) <> Length(sig2.ParamTypes) then + if Length(s1.ParamTypes) <> Length(s2.ParamTypes) then exit(False); - - for j := 0 to High(sig1.ParamTypes) do - begin - if not sig1.ParamTypes[j].IsEqual(sig2.ParamTypes[j]) then + for j := 0 to High(s1.ParamTypes) do + if not s1.ParamTypes[j].IsEqual(s2.ParamTypes[j]) then exit(False); - end; end; - Result := True; end; function TMethodType.GetHashCode: Integer; var - sig: IMethodSignature; h: Integer; + sig: IMethodSignature; begin - // Seed with stMethod, then mix in each signature's hash h := Ord(stMethod); Result := THashBobJenkins.GetHashValue(h, SizeOf(TStaticTypeKind), 0); - for sig in FSignatures do begin if Assigned(sig) then @@ -596,18 +980,20 @@ begin end; end; -// --- +// --- Record Type --- + type - TRecordType = class(TAbstractStaticType) + TRecordType = class(TAbstractStaticType, IRecordType) private FKind: TStaticTypeKind; FDefinition: IScalarRecordDefinition; public constructor Create(AKind: TStaticTypeKind; ADef: IScalarRecordDefinition); function GetKind: TStaticTypeKind; override; - function GetDefinition: IScalarRecordDefinition; override; - function IsStructurallyEqual(const Other: IStaticType): Boolean; override; + function GetDefinition: IScalarRecordDefinition; function GetHashCode: Integer; override; + function AsRecord: IRecordType; override; + function IsStructurallyEqual(const Other: IStaticType): Boolean; override; function ToString: string; override; end; @@ -629,15 +1015,20 @@ begin Result := FDefinition; end; +function TRecordType.AsRecord: IRecordType; +begin + Result := Self; +end; + function TRecordType.IsStructurallyEqual(const Other: IStaticType): Boolean; var i: Integer; begin var uOther := TTypes.Unwrap(Other); - if (not Assigned(uOther)) or (uOther.Kind <> GetKind) then + if uOther.Kind <> FKind then exit(False); + var otherDef := uOther.AsRecord.Definition; - var otherDef := uOther.Definition; if (not Assigned(Self.FDefinition)) or (not Assigned(otherDef)) then exit(False); @@ -649,7 +1040,6 @@ begin if (Self.FDefinition.Keywords[i] <> otherDef.Keywords[i]) or (Self.FDefinition[i] <> otherDef[i]) then exit(False); end; - Result := True; end; @@ -657,19 +1047,13 @@ function TRecordType.GetHashCode: Integer; var i, h: Integer; begin - // Seed with Kind Result := THashBobJenkins.GetHashValue(FKind, SizeOf(TStaticTypeKind), 0); - if Assigned(FDefinition) then begin for i := 0 to FDefinition.Count - 1 do begin - // Hash Key - // Keyword identities are unique by pointer, but let's hash their internal ID/Index for safety h := FDefinition.Keywords[i].Idx; Result := THashBobJenkins.GetHashValue(h, SizeOf(Integer), Result); - - // Hash Field Type Kind h := Ord(FDefinition[i]); Result := THashBobJenkins.GetHashValue(h, SizeOf(Integer), Result); end; @@ -693,17 +1077,19 @@ begin Result := Result + '}'; end; -// --- +// --- Generic Record Type --- + type - TGenericRecordType = class(TAbstractStaticType) + TGenericRecordType = class(TAbstractStaticType, IGenericRecordType) private FDefinition: IGenericRecordDefinition; public constructor Create(const ADef: IGenericRecordDefinition); function GetKind: TStaticTypeKind; override; - function GetGenericDefinition: IGenericRecordDefinition; override; - function IsStructurallyEqual(const Other: IStaticType): Boolean; override; + function GetGenericDefinition: IGenericRecordDefinition; function GetHashCode: Integer; override; + function AsGenericRecord: IGenericRecordType; override; + function IsStructurallyEqual(const Other: IStaticType): Boolean; override; function ToString: string; override; end; @@ -723,15 +1109,20 @@ begin Result := FDefinition; end; +function TGenericRecordType.AsGenericRecord: IGenericRecordType; +begin + Result := Self; +end; + function TGenericRecordType.IsStructurallyEqual(const Other: IStaticType): Boolean; var i: Integer; begin var uOther := TTypes.Unwrap(Other); - if (not Assigned(uOther)) or (uOther.Kind <> stGenericRecord) then + if uOther.Kind <> stGenericRecord then exit(False); + var otherDef := uOther.AsGenericRecord.GenericDefinition; - var otherDef := uOther.GenericDefinition; if (not Assigned(Self.FDefinition)) or (not Assigned(otherDef)) then exit(False); @@ -740,11 +1131,9 @@ begin for i := 0 to Self.FDefinition.Count - 1 do begin - // Deep Check of Field Types if (Self.FDefinition.Keywords[i] <> otherDef.Keywords[i]) or (not Self.FDefinition[i].IsEqual(otherDef[i])) then exit(False); end; - Result := True; end; @@ -754,16 +1143,12 @@ var begin h := Ord(stGenericRecord); Result := THashBobJenkins.GetHashValue(h, SizeOf(TStaticTypeKind), 0); - if Assigned(FDefinition) then begin for i := 0 to FDefinition.Count - 1 do begin - // Hash Key (using Idx) h := FDefinition.Keywords[i].Idx; Result := THashBobJenkins.GetHashValue(h, SizeOf(Integer), Result); - - // Hash Value Type var val := FDefinition[i]; if Assigned(val) then begin @@ -846,11 +1231,49 @@ begin end; end; +{ TMethodSignature } + +constructor TMethodSignature.Create(const AParamTypes: TArray; const AReturnType: IStaticType); +begin + inherited Create; + FParamTypes := AParamTypes; + FReturnType := AReturnType; +end; + +function TMethodSignature.GetParamTypes: TArray; +begin + Result := FParamTypes; +end; + +function TMethodSignature.GetReturnType: IStaticType; +begin + Result := FReturnType; +end; + +function TMethodSignature.GetHashCode: Integer; +var + i, h: Integer; +begin + Result := 0; + if Assigned(FReturnType) then + begin + h := FReturnType.GetHashCode; + Result := THashBobJenkins.GetHashValue(h, SizeOf(Integer), Result); + end; + for i := 0 to High(FParamTypes) do + begin + if Assigned(FParamTypes[i]) then + begin + h := FParamTypes[i].GetHashCode; + Result := THashBobJenkins.GetHashValue(h, SizeOf(Integer), Result); + end; + end; +end; + { TTypes Factory } class constructor TTypes.Create; begin - // 1. Primitives FUnknown := TSimpleStaticType.Create(stUnknown); FVoid := TSimpleStaticType.Create(stVoid); FOrdinal := TSimpleStaticType.Create(stOrdinal); @@ -860,7 +1283,6 @@ begin FText := TSimpleStaticType.Create(stText); FKeyword := TSimpleStaticType.Create(stKeyword); - // 2. Optional Primitives (pre-cached) FOrdinalOpt := TOptionalType.Create(FOrdinal); FFloatOpt := TOptionalType.Create(FFloat); FBooleanOpt := TOptionalType.Create(FBoolean); @@ -868,7 +1290,6 @@ begin FTextOpt := TOptionalType.Create(FText); FKeywordOpt := TOptionalType.Create(FKeyword); - // 3. Caches FSeriesCache := TDictionary.Create; FRecordCache := TDictionary.Create; FRecordSeriesCache := TDictionary.Create; @@ -894,11 +1315,11 @@ begin TMonitor.Enter(FSeriesCache); try - if FSeriesCache.TryGetValue(AElementType, Result) then - exit; - - Result := TSeriesType.Create(AElementType); - FSeriesCache.Add(AElementType, Result); + if not FSeriesCache.TryGetValue(AElementType, Result) then + begin + Result := TSeriesType.Create(AElementType); + FSeriesCache.Add(AElementType, Result); + end; finally TMonitor.Exit(FSeriesCache); end; @@ -908,11 +1329,11 @@ class function TTypes.CreateRecord(const ADef: IScalarRecordDefinition): IStatic begin TMonitor.Enter(FRecordCache); try - if FRecordCache.TryGetValue(ADef, Result) then - exit; - - Result := TRecordType.Create(stRecord, ADef); - FRecordCache.Add(ADef, Result); + if not FRecordCache.TryGetValue(ADef, Result) then + begin + Result := TRecordType.Create(stRecord, ADef); + FRecordCache.Add(ADef, Result); + end; finally TMonitor.Exit(FRecordCache); end; @@ -922,11 +1343,11 @@ class function TTypes.CreateRecordSeries(const ADef: IScalarRecordDefinition): I begin TMonitor.Enter(FRecordSeriesCache); try - if FRecordSeriesCache.TryGetValue(ADef, Result) then - exit; - - Result := TRecordType.Create(stRecordSeries, ADef); - FRecordSeriesCache.Add(ADef, Result); + if not FRecordSeriesCache.TryGetValue(ADef, Result) then + begin + Result := TRecordType.Create(stRecordSeries, ADef); + FRecordSeriesCache.Add(ADef, Result); + end; finally TMonitor.Exit(FRecordSeriesCache); end; @@ -936,22 +1357,19 @@ class function TTypes.CreateGenericRecord(const ADef: IGenericRecordDefinition): begin TMonitor.Enter(FGenericRecordCache); try - if FGenericRecordCache.TryGetValue(ADef, Result) then - exit; - - Result := TGenericRecordType.Create(ADef); - FGenericRecordCache.Add(ADef, Result); + if not FGenericRecordCache.TryGetValue(ADef, Result) then + begin + Result := TGenericRecordType.Create(ADef); + FGenericRecordCache.Add(ADef, Result); + end; finally TMonitor.Exit(FGenericRecordCache); end; end; class function TTypes.CreateMethod(const AParamTypes: TArray; const AReturnType: IStaticType): IStaticType; -var - sig: IMethodSignature; begin - sig := TMethodSignature.Create(AParamTypes, AReturnType); - Result := CreateMethodSet([sig]); + Result := CreateMethodSet([TMethodSignature.Create(AParamTypes, AReturnType)]); end; class function TTypes.CreateMethodSet(const ASignatures: TArray): IStaticType; @@ -961,11 +1379,11 @@ begin TMonitor.Enter(FMethodCache); try - if FMethodCache.TryGetValue(ASignatures, Result) then - exit; - - Result := TMethodType.Create(ASignatures); - FMethodCache.Add(ASignatures, Result); + if not FMethodCache.TryGetValue(ASignatures, Result) then + begin + Result := TMethodType.Create(ASignatures); + FMethodCache.Add(ASignatures, Result); + end; finally TMonitor.Exit(FMethodCache); end; @@ -975,31 +1393,30 @@ class function TTypes.MakeOptional(const AType: IStaticType): IStaticType; begin if (not Assigned(AType)) or (AType.Kind = stUnknown) or (AType.Kind = stVoid) then exit(AType); - if AType.IsOptional then exit(AType); - // Fast-Path using pointer comparison on flyweights + // Fast path flyweights if Pointer(AType) = Pointer(FOrdinal) then exit(FOrdinalOpt); if Pointer(AType) = Pointer(FFloat) then exit(FFloatOpt); if Pointer(AType) = Pointer(FBoolean) then exit(FBooleanOpt); + if Pointer(AType) = Pointer(FDateTime) then + exit(FDateTimeOpt); if Pointer(AType) = Pointer(FText) then exit(FTextOpt); if Pointer(AType) = Pointer(FKeyword) then exit(FKeywordOpt); - if Pointer(AType) = Pointer(FDateTime) then - exit(FDateTimeOpt); TMonitor.Enter(FOptionalCache); try - if FOptionalCache.TryGetValue(AType, Result) then - exit; - - Result := TOptionalType.Create(AType); - FOptionalCache.Add(AType, Result); + if not FOptionalCache.TryGetValue(AType, Result) then + begin + Result := TOptionalType.Create(AType); + FOptionalCache.Add(AType, Result); + end; finally TMonitor.Exit(FOptionalCache); end; @@ -1026,17 +1443,31 @@ begin end; end; +// --- New Factories --- + +class function TTypes.CreateTuple(const AElements: TArray): ITupleType; +begin + Result := TTupleType.Create(AElements); +end; + +class function TTypes.CreateVector(const AElementType: IStaticType; ACount: Integer): IVectorType; +begin + Result := TVectorType.Create(AElementType, ACount); +end; + +class function TTypes.CreateMatrix(const AElementType: IStaticType; const ADimensions: TArray): IMatrixType; +begin + Result := TMatrixType.Create(AElementType, ADimensions); +end; + { TTypeRules } class function TTypeRules.CanAssign(const Target, Source: IStaticType): Boolean; begin if (not Assigned(Target)) or (not Assigned(Source)) then exit(False); - if (Target.Kind = stUnknown) or (Source.Kind = stUnknown) then exit(True); - - // STRICTNESS RULE: Cannot assign Optional to Non-Optional if Source.IsOptional and (not Target.IsOptional) then exit(False); @@ -1068,12 +1499,10 @@ begin if B.Kind = stUnknown then exit(A); - // T + Void -> T? if (A.Kind = stVoid) and (B.Kind <> stVoid) then exit(TTypes.MakeOptional(B)); if (B.Kind = stVoid) and (A.Kind <> stVoid) then exit(TTypes.MakeOptional(A)); - if (A.Kind = stVoid) and (B.Kind = stVoid) then exit(TTypes.Void); @@ -1105,16 +1534,13 @@ class function TTypeRules.ResolveBinaryOp(Op: TScalar.TBinaryOp; const Left, Rig begin if Left.IsOptional or Right.IsOptional then exit(nil); - var promotedType := Promote(Left, Right); - if not Assigned(promotedType) then exit(nil); if promotedType.Kind = stUnknown then exit(TTypes.Unknown); var promotedKind := promotedType.Kind; - case Op of TScalar.TBinaryOp.Add, TScalar.TBinaryOp.Subtract, TScalar.TBinaryOp.Multiply: begin @@ -1122,21 +1548,18 @@ begin exit(nil); Result := promotedType; end; - TScalar.TBinaryOp.Divide: begin if not (promotedKind in [stOrdinal, stFloat, stDateTime]) then exit(nil); Result := TTypes.Float; end; - TScalar.TBinaryOp.Equal, TScalar.TBinaryOp.NotEqual: begin if not (promotedKind in [stOrdinal, stFloat, stKeyword, stBoolean, stDateTime]) then exit(nil); Result := TTypes.Boolean; end; - TScalar.TBinaryOp.Less, TScalar.TBinaryOp.Greater, TScalar.TBinaryOp.LessOrEqual, TScalar.TBinaryOp.GreaterOrEqual: begin if not (promotedKind in [stOrdinal, stFloat, stDateTime]) then @@ -1152,7 +1575,6 @@ class function TTypeRules.ResolveUnaryOp(Op: TScalar.TUnaryOp; const Right: ISta begin if Right.IsOptional then exit(nil); - var rightKind := Right.Kind; if rightKind = stUnknown then exit(TTypes.Unknown); @@ -1164,7 +1586,6 @@ begin exit(nil); Result := Right; end; - TScalar.TUnaryOp.Not: begin if not (rightKind in [stOrdinal, stBoolean]) then diff --git a/Src/Data/Myc.Data.Value.pas b/Src/Data/Myc.Data.Value.pas index dcae958..97c3146 100644 --- a/Src/Data/Myc.Data.Value.pas +++ b/Src/Data/Myc.Data.Value.pas @@ -75,10 +75,9 @@ type class operator Implicit(const AValue: TDataValue): TScalar; overload; inline; class operator Implicit(const AValue: String): TDataValue; overload; inline; class operator Implicit(const AValue: TDataValue.TFunc): TDataValue; overload; inline; - + class operator Implicit(const AValue: ITuple): TDataValue; overload; inline; class operator Implicit(const AValue: IKeywordMapping): TDataValue; overload; inline; class operator Implicit(const AValue: IKeywordMapping): TDataValue; overload; inline; - class operator Implicit(const AValue: IWriteableScalarRecordSeries): TDataValue; overload; inline; class operator Implicit(const AValue: ISeries): TDataValue; overload; inline; class operator Implicit(const AValue: IStream): TDataValue; overload; inline; @@ -102,6 +101,7 @@ type function AsScalar: TScalar; inline; function AsMethod: TFunc; inline; function AsText: String; inline; + function AsTuple: ITuple; inline; function AsRecordSeries: IWriteableScalarRecordSeries; inline; function AsScalarRecord: IKeywordMapping; inline; function AsRecord: IKeywordMapping; inline; @@ -364,6 +364,13 @@ begin Result := (FInterface as TVal).Value; end; +function TDataValue.AsTuple: ITuple; +begin + if (FKind <> vkTuple) then + raise EInvalidCast.Create('Cannot read value as Tuple.'); + Result := ITuple(FInterface); +end; + function TDataValue.ToString: String; var sb: TStringBuilder; @@ -371,6 +378,7 @@ var first: Boolean; i: Integer; begin + first := True; case FKind of vkScalar: Result := FScalar.ToString; vkText: Result := '"' + AsText + '"'; @@ -379,13 +387,29 @@ begin var series := AsSeries; Result := Format('', [series.Count]); end; + vkTuple: + begin + var tuple := AsTuple; + sb := TStringBuilder.Create; + try + for i := 0 to tuple.Count - 1 do + begin + if not first then + sb.Append(','); + sb.Append(tuple[i].Kind.ToString); + first := False; + end; + Result := Format('', [sb.ToString]); + finally + sb.Free; + end; + end; vkRecordSeries: begin var series := AsRecordSeries; sb := TStringBuilder.Create; try sb.Append('{'); - first := True; for i := 0 to series.Def.Count - 1 do begin if not first then @@ -405,7 +429,6 @@ begin sb := TStringBuilder.Create; try sb.Append('{'); - first := True; for i := 0 to rec.Count - 1 do begin if not first then @@ -425,7 +448,6 @@ begin sb := TStringBuilder.Create; try sb.Append('{'); - first := True; for i := 0 to rec.Count - 1 do begin if not first then @@ -479,6 +501,12 @@ begin Result.FInterface := AValue; end; +class operator TDataValue.Implicit(const AValue: ITuple): TDataValue; +begin + Result.FKind := vkTuple; + Result.FInterface := AValue; +end; + { TMapSeries } constructor TMapSeries.Create(const ASourceSeries: ISeries; const AMapperFunc: TDataValue.TFunc); diff --git a/Test/AST/Test.Myc.Ast.RTL.TypeRegistry.pas b/Test/AST/Test.Myc.Ast.RTL.TypeRegistry.pas index 256804c..07a79e7 100644 --- a/Test/AST/Test.Myc.Ast.RTL.TypeRegistry.pas +++ b/Test/AST/Test.Myc.Ast.RTL.TypeRegistry.pas @@ -301,7 +301,7 @@ var staticType: IStaticType; genRec: IGenericRecordDefinition; idx: Integer; - methodType: IStaticType; + methodType: IMethodType; begin // Verify that IMainService was analyzed correctly into an AST definition staticType := TRtlTypeRegistry.GetStaticType(TypeInfo(IMainService)); @@ -309,13 +309,13 @@ begin Assert.AreNotEqual(TStaticTypeKind.stUnknown, staticType.Kind, 'Type should be known'); Assert.AreEqual(TStaticTypeKind.stGenericRecord, staticType.Kind, 'Interface should map to GenericRecord'); - genRec := staticType.GenericDefinition; + genRec := staticType.AsGenericRecord.GenericDefinition; // Check 'Add' method existence idx := genRec.IndexOf(Myc.Data.Keyword.TKeywordRegistry.Intern('Add')); Assert.IsTrue(idx >= 0, 'Method Add should exist in type definition'); - methodType := genRec.Items[idx]; + methodType := genRec.Items[idx].AsMethod; Assert.AreEqual(TStaticTypeKind.stMethod, methodType.Kind); // Add has 2 args (Ordinal, Ordinal) -> Ordinal Assert.AreEqual(Int64(2), Length(methodType.Signatures[0].ParamTypes));