Replaced Count-Node by RTL-Function
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -110,8 +110,8 @@
|
|||||||
;; 2. SIMULATION
|
;; 2. SIMULATION
|
||||||
;; ===========================================================================
|
;; ===========================================================================
|
||||||
|
|
||||||
(def hma-length 250)
|
(def hma-length 14)
|
||||||
(def simulation-steps 5000)
|
(def simulation-steps 500)
|
||||||
|
|
||||||
(def hma-calc (create-hma hma-length))
|
(def hma-calc (create-hma hma-length))
|
||||||
(def prices (new-series [[:close :Float]]))
|
(def prices (new-series [[:close :Float]]))
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ type
|
|||||||
function VisitBlockExpression(const Node: IAstNode): Boolean;
|
function VisitBlockExpression(const Node: IAstNode): Boolean;
|
||||||
function VisitRecordLiteral(const Node: IAstNode): Boolean;
|
function VisitRecordLiteral(const Node: IAstNode): Boolean;
|
||||||
function VisitVariableDeclaration(const Node: IAstNode): Boolean;
|
function VisitVariableDeclaration(const Node: IAstNode): Boolean;
|
||||||
function VisitSeriesLength(const Node: IAstNode): Boolean;
|
|
||||||
|
|
||||||
// --- Elements ---
|
// --- Elements ---
|
||||||
function VisitRecordField(const Node: IAstNode): Boolean;
|
function VisitRecordField(const Node: IAstNode): Boolean;
|
||||||
@@ -120,7 +119,6 @@ begin
|
|||||||
Register(akRecordLiteral, VisitRecordLiteral);
|
Register(akRecordLiteral, VisitRecordLiteral);
|
||||||
Register(akCreateSeries, VisitCreateSeries);
|
Register(akCreateSeries, VisitCreateSeries);
|
||||||
Register(akAddSeriesItem, VisitAddSeriesItem);
|
Register(akAddSeriesItem, VisitAddSeriesItem);
|
||||||
Register(akSeriesLength, VisitSeriesLength);
|
|
||||||
Register(akRecur, VisitRecurNode);
|
Register(akRecur, VisitRecurNode);
|
||||||
Register(akNop, VisitNop);
|
Register(akNop, VisitNop);
|
||||||
|
|
||||||
@@ -257,13 +255,6 @@ begin
|
|||||||
Result := IsNodePure(Node.AsMemberAccess.Base);
|
Result := IsNodePure(Node.AsMemberAccess.Base);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TPurityAnalyzer.VisitSeriesLength(const Node: IAstNode): Boolean;
|
|
||||||
begin
|
|
||||||
// Querying length is pure.
|
|
||||||
// The series identifier check happens in VisitIdentifier.
|
|
||||||
Result := True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
// --- Forbidden (Impure) ---
|
// --- Forbidden (Impure) ---
|
||||||
|
|
||||||
function TPurityAnalyzer.VisitAssignment(const Node: IAstNode): Boolean;
|
function TPurityAnalyzer.VisitAssignment(const Node: IAstNode): Boolean;
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ type
|
|||||||
function VisitMemberAccess(const Node: IAstNode): IAstNode;
|
function VisitMemberAccess(const Node: IAstNode): IAstNode;
|
||||||
function VisitIndexer(const Node: IAstNode): IAstNode;
|
function VisitIndexer(const Node: IAstNode): IAstNode;
|
||||||
function VisitCreateSeries(const Node: IAstNode): IAstNode;
|
function VisitCreateSeries(const Node: IAstNode): IAstNode;
|
||||||
function VisitSeriesLength(const Node: IAstNode): IAstNode;
|
|
||||||
function VisitRecurNode(const Node: IAstNode): IAstNode;
|
function VisitRecurNode(const Node: IAstNode): IAstNode;
|
||||||
function VisitNop(const Node: IAstNode): IAstNode;
|
function VisitNop(const Node: IAstNode): IAstNode;
|
||||||
function VisitRecordLiteral(const Node: IAstNode): IAstNode;
|
function VisitRecordLiteral(const Node: IAstNode): IAstNode;
|
||||||
@@ -232,7 +231,6 @@ begin
|
|||||||
Register(akMemberAccess, VisitMemberAccess);
|
Register(akMemberAccess, VisitMemberAccess);
|
||||||
Register(akIndexer, VisitIndexer);
|
Register(akIndexer, VisitIndexer);
|
||||||
Register(akCreateSeries, VisitCreateSeries);
|
Register(akCreateSeries, VisitCreateSeries);
|
||||||
Register(akSeriesLength, VisitSeriesLength);
|
|
||||||
Register(akRecur, VisitRecurNode);
|
Register(akRecur, VisitRecurNode);
|
||||||
Register(akNop, VisitNop);
|
Register(akNop, VisitNop);
|
||||||
Register(akRecordLiteral, VisitRecordLiteral);
|
Register(akRecordLiteral, VisitRecordLiteral);
|
||||||
@@ -960,11 +958,6 @@ begin
|
|||||||
Result := TAst.CreateSeries(Node.Identity, defNode, recDef, resType);
|
Result := TAst.CreateSeries(Node.Identity, defNode, recDef, resType);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTypeChecker.VisitSeriesLength(const Node: IAstNode): IAstNode;
|
|
||||||
begin
|
|
||||||
Result := TAst.SeriesLength(Node.Identity, Accept(Node.AsSeriesLength.Series).AsIdentifier, TTypes.Ordinal);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TTypeChecker.VisitNop(const Node: IAstNode): IAstNode;
|
function TTypeChecker.VisitNop(const Node: IAstNode): IAstNode;
|
||||||
begin
|
begin
|
||||||
Result := TAst.Nop(Node.Identity, TTypes.Void);
|
Result := TAst.Nop(Node.Identity, TTypes.Void);
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ type
|
|||||||
function VisitRecordField(const Node: IAstNode): TVoid;
|
function VisitRecordField(const Node: IAstNode): TVoid;
|
||||||
function VisitCreateSeries(const Node: IAstNode): TVoid;
|
function VisitCreateSeries(const Node: IAstNode): TVoid;
|
||||||
function VisitAddSeriesItem(const Node: IAstNode): TVoid;
|
function VisitAddSeriesItem(const Node: IAstNode): TVoid;
|
||||||
function VisitSeriesLength(const Node: IAstNode): TVoid;
|
|
||||||
function VisitNop(const Node: IAstNode): TVoid;
|
function VisitNop(const Node: IAstNode): TVoid;
|
||||||
function VisitTuple(const Node: IAstNode): TVoid;
|
function VisitTuple(const Node: IAstNode): TVoid;
|
||||||
function VisitPipe(const Node: IAstNode): TVoid;
|
function VisitPipe(const Node: IAstNode): TVoid;
|
||||||
@@ -122,7 +121,6 @@ begin
|
|||||||
Register(akRecordLiteral, VisitRecordLiteral);
|
Register(akRecordLiteral, VisitRecordLiteral);
|
||||||
Register(akCreateSeries, VisitCreateSeries);
|
Register(akCreateSeries, VisitCreateSeries);
|
||||||
Register(akAddSeriesItem, VisitAddSeriesItem);
|
Register(akAddSeriesItem, VisitAddSeriesItem);
|
||||||
Register(akSeriesLength, VisitSeriesLength);
|
|
||||||
Register(akRecur, VisitRecurNode);
|
Register(akRecur, VisitRecurNode);
|
||||||
Register(akNop, VisitNop);
|
Register(akNop, VisitNop);
|
||||||
Register(akPipe, VisitPipe);
|
Register(akPipe, VisitPipe);
|
||||||
@@ -517,14 +515,6 @@ begin
|
|||||||
Unindent;
|
Unindent;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TAstDumper.VisitSeriesLength(const Node: IAstNode): TVoid;
|
|
||||||
begin
|
|
||||||
Log('SeriesLength', Node);
|
|
||||||
Indent;
|
|
||||||
Visit(Node.AsSeriesLength.Series);
|
|
||||||
Unindent;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TAstDumper.VisitNop(const Node: IAstNode): TVoid;
|
function TAstDumper.VisitNop(const Node: IAstNode): TVoid;
|
||||||
begin
|
begin
|
||||||
Log('Nop', Node);
|
Log('Nop', Node);
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ type
|
|||||||
function VisitRecordLiteral(const N: IRecordLiteralNode): TDataValue; virtual;
|
function VisitRecordLiteral(const N: IRecordLiteralNode): TDataValue; virtual;
|
||||||
function VisitCreateSeries(const N: ICreateSeriesNode): TDataValue; virtual;
|
function VisitCreateSeries(const N: ICreateSeriesNode): TDataValue; virtual;
|
||||||
function VisitAddSeriesItem(const N: IAddSeriesItemNode): TDataValue; virtual;
|
function VisitAddSeriesItem(const N: IAddSeriesItemNode): TDataValue; virtual;
|
||||||
function VisitSeriesLength(const N: ISeriesLengthNode): TDataValue; virtual;
|
|
||||||
function VisitRecurNode(const N: IRecurNode): TDataValue; virtual;
|
function VisitRecurNode(const N: IRecurNode): TDataValue; virtual;
|
||||||
function VisitPipe(const N: IPipeNode): TDataValue; virtual;
|
function VisitPipe(const N: IPipeNode): TDataValue; virtual;
|
||||||
|
|
||||||
@@ -107,7 +106,6 @@ begin
|
|||||||
akRecordLiteral: Result := VisitRecordLiteral(Node.AsRecordLiteral);
|
akRecordLiteral: Result := VisitRecordLiteral(Node.AsRecordLiteral);
|
||||||
akCreateSeries: Result := VisitCreateSeries(Node.AsCreateSeries);
|
akCreateSeries: Result := VisitCreateSeries(Node.AsCreateSeries);
|
||||||
akAddSeriesItem: Result := VisitAddSeriesItem(Node.AsAddSeriesItem);
|
akAddSeriesItem: Result := VisitAddSeriesItem(Node.AsAddSeriesItem);
|
||||||
akSeriesLength: Result := VisitSeriesLength(Node.AsSeriesLength);
|
|
||||||
akRecur: Result := VisitRecurNode(Node.AsRecur);
|
akRecur: Result := VisitRecurNode(Node.AsRecur);
|
||||||
akPipe: Result := VisitPipe(Node.AsPipe);
|
akPipe: Result := VisitPipe(Node.AsPipe);
|
||||||
akMacroExpansion: Result := Visit(Node.AsMacroExpansion.ExpandedBody);
|
akMacroExpansion: Result := Visit(Node.AsMacroExpansion.ExpandedBody);
|
||||||
@@ -546,15 +544,6 @@ begin
|
|||||||
Result := TDataValue.Void;
|
Result := TDataValue.Void;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TEvaluatorVisitor.VisitSeriesLength(const N: ISeriesLengthNode): TDataValue;
|
|
||||||
begin
|
|
||||||
var s := FScope[N.Series.Address];
|
|
||||||
var len :=
|
|
||||||
if s.Kind = vkSeries then s.AsSeries.Count
|
|
||||||
else s.AsRecordSeries.RecordCount;
|
|
||||||
Result := TDataValue(TScalar.FromInt64(len));
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TEvaluatorVisitor.VisitPipe(const N: IPipeNode): TDataValue;
|
function TEvaluatorVisitor.VisitPipe(const N: IPipeNode): TDataValue;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ type
|
|||||||
function VisitRecordLiteral(const Node: IAstNode): TJSONValue;
|
function VisitRecordLiteral(const Node: IAstNode): TJSONValue;
|
||||||
function VisitCreateSeries(const Node: IAstNode): TJSONValue;
|
function VisitCreateSeries(const Node: IAstNode): TJSONValue;
|
||||||
function VisitAddSeriesItem(const Node: IAstNode): TJSONValue;
|
function VisitAddSeriesItem(const Node: IAstNode): TJSONValue;
|
||||||
function VisitSeriesLength(const Node: IAstNode): TJSONValue;
|
|
||||||
function VisitNop(const Node: IAstNode): TJSONValue;
|
function VisitNop(const Node: IAstNode): TJSONValue;
|
||||||
function VisitPipe(const Node: IAstNode): TJSONValue;
|
function VisitPipe(const Node: IAstNode): TJSONValue;
|
||||||
|
|
||||||
@@ -101,7 +100,6 @@ begin
|
|||||||
Register(akRecordLiteral, VisitRecordLiteral);
|
Register(akRecordLiteral, VisitRecordLiteral);
|
||||||
Register(akCreateSeries, VisitCreateSeries);
|
Register(akCreateSeries, VisitCreateSeries);
|
||||||
Register(akAddSeriesItem, VisitAddSeriesItem);
|
Register(akAddSeriesItem, VisitAddSeriesItem);
|
||||||
Register(akSeriesLength, VisitSeriesLength);
|
|
||||||
Register(akRecur, VisitRecurNode);
|
Register(akRecur, VisitRecurNode);
|
||||||
Register(akNop, VisitNop);
|
Register(akNop, VisitNop);
|
||||||
Register(akPipe, VisitPipe);
|
Register(akPipe, VisitPipe);
|
||||||
@@ -421,16 +419,6 @@ begin
|
|||||||
Result := arr;
|
Result := arr;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TJsonAstConverter.VisitSeriesLength(const Node: IAstNode): TJSONValue;
|
|
||||||
var
|
|
||||||
arr: TJSONArray;
|
|
||||||
begin
|
|
||||||
arr := TJSONArray.Create;
|
|
||||||
arr.Add('Count');
|
|
||||||
arr.AddElement(Visit(Node.AsSeriesLength.Series));
|
|
||||||
Result := arr;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TJsonAstConverter.VisitRecurNode(const Node: IAstNode): TJSONValue;
|
function TJsonAstConverter.VisitRecurNode(const Node: IAstNode): TJSONValue;
|
||||||
var
|
var
|
||||||
arr: TJSONArray;
|
arr: TJSONArray;
|
||||||
@@ -623,8 +611,6 @@ begin
|
|||||||
exit(TAst.MemberAccess(JsonToNode(arr.Items[1]), JsonToNode(arr.Items[2]).AsKeyword));
|
exit(TAst.MemberAccess(JsonToNode(arr.Items[1]), JsonToNode(arr.Items[2]).AsKeyword));
|
||||||
if kind = 'Series' then
|
if kind = 'Series' then
|
||||||
exit(TAst.CreateSeries(JsonToNode(arr.Items[1])));
|
exit(TAst.CreateSeries(JsonToNode(arr.Items[1])));
|
||||||
if kind = 'Count' then
|
|
||||||
exit(TAst.SeriesLength(JsonToNode(arr.Items[1]).AsIdentifier));
|
|
||||||
if kind = 'Pipe' then
|
if kind = 'Pipe' then
|
||||||
exit(TAst.Pipe(JsonToNode(arr.Items[1]).AsTuple, JsonToNode(arr.Items[2]).AsLambdaExpression));
|
exit(TAst.Pipe(JsonToNode(arr.Items[1]).AsTuple, JsonToNode(arr.Items[2]).AsLambdaExpression));
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,6 @@ type
|
|||||||
IRecordLiteralNode = interface;
|
IRecordLiteralNode = interface;
|
||||||
ICreateSeriesNode = interface;
|
ICreateSeriesNode = interface;
|
||||||
IAddSeriesItemNode = interface;
|
IAddSeriesItemNode = interface;
|
||||||
ISeriesLengthNode = interface;
|
|
||||||
IRecurNode = interface;
|
IRecurNode = interface;
|
||||||
INopNode = interface;
|
INopNode = interface;
|
||||||
IPipeNode = interface;
|
IPipeNode = interface;
|
||||||
@@ -130,7 +129,6 @@ type
|
|||||||
akRecordLiteral,
|
akRecordLiteral,
|
||||||
akCreateSeries,
|
akCreateSeries,
|
||||||
akAddSeriesItem,
|
akAddSeriesItem,
|
||||||
akSeriesLength,
|
|
||||||
akRecur,
|
akRecur,
|
||||||
akNop,
|
akNop,
|
||||||
akPipe
|
akPipe
|
||||||
@@ -178,7 +176,6 @@ type
|
|||||||
function AsRecordLiteral: IRecordLiteralNode;
|
function AsRecordLiteral: IRecordLiteralNode;
|
||||||
function AsCreateSeries: ICreateSeriesNode;
|
function AsCreateSeries: ICreateSeriesNode;
|
||||||
function AsAddSeriesItem: IAddSeriesItemNode;
|
function AsAddSeriesItem: IAddSeriesItemNode;
|
||||||
function AsSeriesLength: ISeriesLengthNode;
|
|
||||||
function AsRecur: IRecurNode;
|
function AsRecur: IRecurNode;
|
||||||
function AsNop: INopNode;
|
function AsNop: INopNode;
|
||||||
function AsPipe: IPipeNode;
|
function AsPipe: IPipeNode;
|
||||||
@@ -532,17 +529,6 @@ type
|
|||||||
property Lookback: IAstNode read GetLookback;
|
property Lookback: IAstNode read GetLookback;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
[AstTag('Count')]
|
|
||||||
[AstDoc('Returns the current number of elements in a series.')]
|
|
||||||
[AstScriptExample('(count prices)')]
|
|
||||||
[AstField(0, 'series', fkNode)]
|
|
||||||
ISeriesLengthNode = interface(IAstTypedNode)
|
|
||||||
{$region 'private'}
|
|
||||||
function GetSeries: IIdentifierNode;
|
|
||||||
{$endregion}
|
|
||||||
property Series: IIdentifierNode read GetSeries;
|
|
||||||
end;
|
|
||||||
|
|
||||||
[AstTag('Recur')]
|
[AstTag('Recur')]
|
||||||
[AstDoc('Tail-recursive call to the current function.')]
|
[AstDoc('Tail-recursive call to the current function.')]
|
||||||
[AstScriptExample('(recur (- n 1))')]
|
[AstScriptExample('(recur (- n 1))')]
|
||||||
@@ -623,7 +609,6 @@ type
|
|||||||
function AsRecordLiteral: IRecordLiteralNode; virtual;
|
function AsRecordLiteral: IRecordLiteralNode; virtual;
|
||||||
function AsCreateSeries: ICreateSeriesNode; virtual;
|
function AsCreateSeries: ICreateSeriesNode; virtual;
|
||||||
function AsAddSeriesItem: IAddSeriesItemNode; virtual;
|
function AsAddSeriesItem: IAddSeriesItemNode; virtual;
|
||||||
function AsSeriesLength: ISeriesLengthNode; virtual;
|
|
||||||
function AsRecur: IRecurNode; virtual;
|
function AsRecur: IRecurNode; virtual;
|
||||||
function AsNop: INopNode; virtual;
|
function AsNop: INopNode; virtual;
|
||||||
function AsPipe: IPipeNode; virtual;
|
function AsPipe: IPipeNode; virtual;
|
||||||
@@ -996,17 +981,6 @@ type
|
|||||||
function AsAddSeriesItem: IAddSeriesItemNode; override;
|
function AsAddSeriesItem: IAddSeriesItemNode; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TSeriesLengthNode = class(TAstTypedNode, ISeriesLengthNode)
|
|
||||||
private
|
|
||||||
FSeries: IIdentifierNode;
|
|
||||||
function GetSeries: IIdentifierNode;
|
|
||||||
protected
|
|
||||||
function GetKind: TAstNodeKind; override;
|
|
||||||
public
|
|
||||||
constructor Create(const ASeries: IIdentifierNode; const AStaticType: IStaticType; const AIdentity: IAstIdentity);
|
|
||||||
function AsSeriesLength: ISeriesLengthNode; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
TRecurNode = class(TAstTypedNode, IRecurNode)
|
TRecurNode = class(TAstTypedNode, IRecurNode)
|
||||||
private
|
private
|
||||||
FArguments: ITupleNode;
|
FArguments: ITupleNode;
|
||||||
@@ -1288,10 +1262,6 @@ function TAstNode.AsAddSeriesItem: IAddSeriesItemNode;
|
|||||||
begin
|
begin
|
||||||
Result := nil;
|
Result := nil;
|
||||||
end;
|
end;
|
||||||
function TAstNode.AsSeriesLength: ISeriesLengthNode;
|
|
||||||
begin
|
|
||||||
Result := nil;
|
|
||||||
end;
|
|
||||||
function TAstNode.AsRecur: IRecurNode;
|
function TAstNode.AsRecur: IRecurNode;
|
||||||
begin
|
begin
|
||||||
Result := nil;
|
Result := nil;
|
||||||
@@ -1992,27 +1962,6 @@ begin
|
|||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TSeriesLengthNode }
|
|
||||||
|
|
||||||
constructor TSeriesLengthNode.Create(const ASeries: IIdentifierNode; const AStaticType: IStaticType; const AIdentity: IAstIdentity);
|
|
||||||
begin
|
|
||||||
inherited Create(AStaticType, AIdentity);
|
|
||||||
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;
|
|
||||||
|
|
||||||
{ TRecurNode }
|
{ TRecurNode }
|
||||||
|
|
||||||
constructor TRecurNode.Create(const AArguments: ITupleNode; const AStaticType: IStaticType; const AIdentity: IAstIdentity);
|
constructor TRecurNode.Create(const AArguments: ITupleNode; const AStaticType: IStaticType; const AIdentity: IAstIdentity);
|
||||||
|
|||||||
@@ -39,6 +39,12 @@ type
|
|||||||
[AstDoc('Returns true if at least one element satisfies the predicate.')]
|
[AstDoc('Returns true if at least one element satisfies the predicate.')]
|
||||||
[AstSignature('(series, (any) -> boolean) -> boolean')]
|
[AstSignature('(series, (any) -> boolean) -> boolean')]
|
||||||
class function Any(const Args: TArray<TDataValue>): TDataValue; static;
|
class function Any(const Args: TArray<TDataValue>): TDataValue; static;
|
||||||
|
|
||||||
|
[TRtlExport('count', Pure)]
|
||||||
|
[AstDoc('Returns the current number of elements in a series.')]
|
||||||
|
[AstSignature('(series) -> number')]
|
||||||
|
[AstScriptExample('(count prices)')]
|
||||||
|
class function Count(const Args: TArray<TDataValue>): TDataValue; static;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@@ -244,4 +250,19 @@ begin
|
|||||||
Result := TScalar.FromBoolean(False);
|
Result := TScalar.FromBoolean(False);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
class function TRtlSeriesFunctions.Count(const Args: TArray<TDataValue>): TDataValue;
|
||||||
|
begin
|
||||||
|
if Length(Args) <> 1 then
|
||||||
|
raise EArgumentException.Create('Count requires one argument: a series.');
|
||||||
|
|
||||||
|
var sourceArg := Args[0];
|
||||||
|
|
||||||
|
case sourceArg.Kind of
|
||||||
|
vkSeries: Result := sourceArg.AsSeries.Count;
|
||||||
|
vkRecordSeries: Result := sourceArg.AsRecordSeries.Count;
|
||||||
|
else
|
||||||
|
raise EArgumentException.Create('The argument to Count must be a series.');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ type
|
|||||||
function VisitRecordLiteral(const N: IAstNode): TVoid;
|
function VisitRecordLiteral(const N: IAstNode): TVoid;
|
||||||
function VisitCreateSeries(const N: IAstNode): TVoid;
|
function VisitCreateSeries(const N: IAstNode): TVoid;
|
||||||
function VisitAddSeriesItem(const N: IAstNode): TVoid;
|
function VisitAddSeriesItem(const N: IAstNode): TVoid;
|
||||||
function VisitSeriesLength(const N: IAstNode): TVoid;
|
|
||||||
function VisitRecurNode(const N: IAstNode): TVoid;
|
function VisitRecurNode(const N: IAstNode): TVoid;
|
||||||
function VisitNop(const N: IAstNode): TVoid;
|
function VisitNop(const N: IAstNode): TVoid;
|
||||||
|
|
||||||
@@ -108,7 +107,6 @@ begin
|
|||||||
Register(akRecordLiteral, VisitRecordLiteral);
|
Register(akRecordLiteral, VisitRecordLiteral);
|
||||||
Register(akCreateSeries, VisitCreateSeries);
|
Register(akCreateSeries, VisitCreateSeries);
|
||||||
Register(akAddSeriesItem, VisitAddSeriesItem);
|
Register(akAddSeriesItem, VisitAddSeriesItem);
|
||||||
Register(akSeriesLength, VisitSeriesLength);
|
|
||||||
Register(akRecur, VisitRecurNode);
|
Register(akRecur, VisitRecurNode);
|
||||||
Register(akNop, VisitNop);
|
Register(akNop, VisitNop);
|
||||||
|
|
||||||
@@ -480,11 +478,4 @@ begin
|
|||||||
Append(')');
|
Append(')');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TPrettyPrintVisitor.VisitSeriesLength(const N: IAstNode): TVoid;
|
|
||||||
begin
|
|
||||||
Append('(count ');
|
|
||||||
Visit(N.AsSeriesLength.Series);
|
|
||||||
Append(')');
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
@@ -224,9 +224,6 @@ type
|
|||||||
[Ebnf('form-add ::= "add-item" expression expression [ expression ]')]
|
[Ebnf('form-add ::= "add-item" expression expression [ expression ]')]
|
||||||
function ParseAddItem: IAstNode;
|
function ParseAddItem: IAstNode;
|
||||||
|
|
||||||
[Ebnf('form-count ::= "count" expression')]
|
|
||||||
function ParseCount: IAstNode;
|
|
||||||
|
|
||||||
[Ebnf('form-get ::= "get" expression expression')]
|
[Ebnf('form-get ::= "get" expression expression')]
|
||||||
function ParseGet: IAstNode;
|
function ParseGet: IAstNode;
|
||||||
|
|
||||||
@@ -510,7 +507,6 @@ begin
|
|||||||
FSpecialForms.Add('pipe', ParsePipe);
|
FSpecialForms.Add('pipe', ParsePipe);
|
||||||
FSpecialForms.Add('new-series', ParseNewSeries);
|
FSpecialForms.Add('new-series', ParseNewSeries);
|
||||||
FSpecialForms.Add('add-item', ParseAddItem);
|
FSpecialForms.Add('add-item', ParseAddItem);
|
||||||
FSpecialForms.Add('count', ParseCount);
|
|
||||||
FSpecialForms.Add('get', ParseGet);
|
FSpecialForms.Add('get', ParseGet);
|
||||||
NextToken;
|
NextToken;
|
||||||
end;
|
end;
|
||||||
@@ -995,16 +991,6 @@ begin
|
|||||||
Result := TAst.AddSeriesItem(s.AsIdentifier, v, lb);
|
Result := TAst.AddSeriesItem(s.AsIdentifier, v, lb);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TParser.ParseCount: IAstNode;
|
|
||||||
var
|
|
||||||
s: IAstNode;
|
|
||||||
begin
|
|
||||||
s := ParseExpression;
|
|
||||||
if s.Kind <> akIdentifier then
|
|
||||||
Error('Count argument must be an identifier');
|
|
||||||
Result := TAst.SeriesLength(s.AsIdentifier);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TParser.ParseGet: IAstNode;
|
function TParser.ParseGet: IAstNode;
|
||||||
var
|
var
|
||||||
base, idx: IAstNode;
|
base, idx: IAstNode;
|
||||||
|
|||||||
@@ -55,9 +55,6 @@ type
|
|||||||
function GetHashCode: Integer;
|
function GetHashCode: Integer;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
IGenericRecordDefinition = IKeywordMapping<IStaticType>;
|
|
||||||
TGenericRecordRegistry = TKeywordMappingRegistry<IStaticType>;
|
|
||||||
|
|
||||||
IScalarRecordDefinition = Myc.Data.Scalar.IScalarRecordDefinition;
|
IScalarRecordDefinition = Myc.Data.Scalar.IScalarRecordDefinition;
|
||||||
|
|
||||||
// Base Interface
|
// Base Interface
|
||||||
@@ -137,6 +134,9 @@ type
|
|||||||
property Definition: IScalarRecordDefinition read GetDefinition;
|
property Definition: IScalarRecordDefinition read GetDefinition;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
IGenericRecordDefinition = IKeywordMapping<IStaticType>;
|
||||||
|
TGenericRecordRegistry = TKeywordMappingRegistry<IStaticType>;
|
||||||
|
|
||||||
IGenericRecordType = interface(IStaticType)
|
IGenericRecordType = interface(IStaticType)
|
||||||
{$region 'private'}
|
{$region 'private'}
|
||||||
function GetGenericDefinition: IGenericRecordDefinition;
|
function GetGenericDefinition: IGenericRecordDefinition;
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ type
|
|||||||
function VisitMemberAccess(const N: IAstNode): IAstNode;
|
function VisitMemberAccess(const N: IAstNode): IAstNode;
|
||||||
function VisitRecordLiteral(const N: IAstNode): IAstNode;
|
function VisitRecordLiteral(const N: IAstNode): IAstNode;
|
||||||
function VisitAddSeriesItem(const N: IAstNode): IAstNode;
|
function VisitAddSeriesItem(const N: IAstNode): IAstNode;
|
||||||
function VisitSeriesLength(const N: IAstNode): IAstNode;
|
|
||||||
function VisitRecurNode(const N: IAstNode): IAstNode;
|
function VisitRecurNode(const N: IAstNode): IAstNode;
|
||||||
|
|
||||||
// Unified List Type
|
// Unified List Type
|
||||||
@@ -114,7 +113,6 @@ type
|
|||||||
function WalkMemberAccess(const N: IAstNode): TVoid;
|
function WalkMemberAccess(const N: IAstNode): TVoid;
|
||||||
function WalkRecordLiteral(const N: IAstNode): TVoid;
|
function WalkRecordLiteral(const N: IAstNode): TVoid;
|
||||||
function WalkAddSeriesItem(const N: IAstNode): TVoid;
|
function WalkAddSeriesItem(const N: IAstNode): TVoid;
|
||||||
function WalkSeriesLength(const N: IAstNode): TVoid;
|
|
||||||
function WalkRecurNode(const N: IAstNode): TVoid;
|
function WalkRecurNode(const N: IAstNode): TVoid;
|
||||||
|
|
||||||
function WalkTuple(const N: IAstNode): TVoid;
|
function WalkTuple(const N: IAstNode): TVoid;
|
||||||
@@ -220,7 +218,6 @@ begin
|
|||||||
Register(akMemberAccess, VisitMemberAccess);
|
Register(akMemberAccess, VisitMemberAccess);
|
||||||
Register(akRecordLiteral, VisitRecordLiteral);
|
Register(akRecordLiteral, VisitRecordLiteral);
|
||||||
Register(akAddSeriesItem, VisitAddSeriesItem);
|
Register(akAddSeriesItem, VisitAddSeriesItem);
|
||||||
Register(akSeriesLength, VisitSeriesLength);
|
|
||||||
Register(akRecur, VisitRecurNode);
|
Register(akRecur, VisitRecurNode);
|
||||||
|
|
||||||
// Unified List Type
|
// Unified List Type
|
||||||
@@ -487,19 +484,6 @@ begin
|
|||||||
Result := TAst.AddSeriesItem(N.Identity, s.AsIdentifier, v, l, A.StaticType);
|
Result := TAst.AddSeriesItem(N.Identity, s.AsIdentifier, v, l, A.StaticType);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TAstTransformer.VisitSeriesLength(const N: IAstNode): IAstNode;
|
|
||||||
var
|
|
||||||
S: ISeriesLengthNode;
|
|
||||||
series: IAstNode;
|
|
||||||
begin
|
|
||||||
S := N.AsSeriesLength;
|
|
||||||
series := Visit(S.Series);
|
|
||||||
if series = S.Series then
|
|
||||||
Result := N
|
|
||||||
else
|
|
||||||
Result := TAst.SeriesLength(N.Identity, series.AsIdentifier, S.StaticType);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TAstTransformer.VisitRecurNode(const N: IAstNode): IAstNode;
|
function TAstTransformer.VisitRecurNode(const N: IAstNode): IAstNode;
|
||||||
var
|
var
|
||||||
R: IRecurNode;
|
R: IRecurNode;
|
||||||
@@ -593,7 +577,6 @@ begin
|
|||||||
Register(akMemberAccess, WalkMemberAccess);
|
Register(akMemberAccess, WalkMemberAccess);
|
||||||
Register(akRecordLiteral, WalkRecordLiteral);
|
Register(akRecordLiteral, WalkRecordLiteral);
|
||||||
Register(akAddSeriesItem, WalkAddSeriesItem);
|
Register(akAddSeriesItem, WalkAddSeriesItem);
|
||||||
Register(akSeriesLength, WalkSeriesLength);
|
|
||||||
Register(akRecur, WalkRecurNode);
|
Register(akRecur, WalkRecurNode);
|
||||||
|
|
||||||
Register(akTuple, WalkTuple);
|
Register(akTuple, WalkTuple);
|
||||||
@@ -716,11 +699,6 @@ begin
|
|||||||
Visit(A.Lookback);
|
Visit(A.Lookback);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TAstVisitor.WalkSeriesLength(const N: IAstNode): TVoid;
|
|
||||||
begin
|
|
||||||
Visit(N.AsSeriesLength.Series);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TAstVisitor.WalkRecurNode(const N: IAstNode): TVoid;
|
function TAstVisitor.WalkRecurNode(const N: IAstNode): TVoid;
|
||||||
begin
|
begin
|
||||||
Visit(N.AsRecur.Arguments);
|
Visit(N.AsRecur.Arguments);
|
||||||
|
|||||||
@@ -262,13 +262,6 @@ type
|
|||||||
const AStaticType: IStaticType = nil
|
const AStaticType: IStaticType = nil
|
||||||
): IAddSeriesItemNode; overload; static;
|
): IAddSeriesItemNode; overload; static;
|
||||||
|
|
||||||
class function SeriesLength(const ASeries: IIdentifierNode; const Loc: ISourceLocation = nil): ISeriesLengthNode; overload; static;
|
|
||||||
class function SeriesLength(
|
|
||||||
const Identity: IAstIdentity;
|
|
||||||
const ASeries: IIdentifierNode;
|
|
||||||
const AStaticType: IStaticType = nil
|
|
||||||
): ISeriesLengthNode; overload; static;
|
|
||||||
|
|
||||||
// --- PIPES ---
|
// --- PIPES ---
|
||||||
|
|
||||||
class function Pipe(
|
class function Pipe(
|
||||||
@@ -871,27 +864,6 @@ begin
|
|||||||
);
|
);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TAst.SeriesLength(const ASeries: IIdentifierNode; const Loc: ISourceLocation): ISeriesLengthNode;
|
|
||||||
begin
|
|
||||||
var id := TIdentities.Structural(Loc);
|
|
||||||
Result := TSeriesLengthNode.Create(ASeries, TTypes.Ordinal, id);
|
|
||||||
end;
|
|
||||||
|
|
||||||
class function TAst.SeriesLength(
|
|
||||||
const Identity: IAstIdentity;
|
|
||||||
const ASeries: IIdentifierNode;
|
|
||||||
const AStaticType: IStaticType
|
|
||||||
): ISeriesLengthNode;
|
|
||||||
begin
|
|
||||||
Result :=
|
|
||||||
TSeriesLengthNode.Create(
|
|
||||||
ASeries,
|
|
||||||
if AStaticType <> nil then AStaticType
|
|
||||||
else TTypes.Ordinal,
|
|
||||||
Identity
|
|
||||||
);
|
|
||||||
end;
|
|
||||||
|
|
||||||
// --- PIPES ---
|
// --- PIPES ---
|
||||||
|
|
||||||
class function TAst.Pipe(const AInputs: ITupleNode; const ATransformation: ILambdaExpressionNode; const Loc: ISourceLocation): IPipeNode;
|
class function TAst.Pipe(const AInputs: ITupleNode; const ATransformation: ILambdaExpressionNode; const Loc: ISourceLocation): IPipeNode;
|
||||||
|
|||||||
@@ -113,12 +113,6 @@ type
|
|||||||
function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
|
function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TSeriesLengthNodeHandler = class(TBaseNodeHandler<ISeriesLengthNode>)
|
|
||||||
public
|
|
||||||
procedure BuildUI(OwnerNode: TAstViewNode); override;
|
|
||||||
function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{ TVariableDeclarationNodeHandler }
|
{ TVariableDeclarationNodeHandler }
|
||||||
@@ -420,21 +414,4 @@ begin
|
|||||||
);
|
);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TSeriesLengthNodeHandler }
|
|
||||||
|
|
||||||
procedure TSeriesLengthNodeHandler.BuildUI(OwnerNode: TAstViewNode);
|
|
||||||
var
|
|
||||||
titleLabel: TTextNode;
|
|
||||||
begin
|
|
||||||
OwnerNode.Frameless := True;
|
|
||||||
OwnerNode.Orientation := loHorizontal;
|
|
||||||
titleLabel := OwnerNode.AddLabel(OwnerNode, 'count ' + FNode.Series.Name);
|
|
||||||
titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TSeriesLengthNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
|
|
||||||
begin
|
|
||||||
Result := TAst.SeriesLength(FNode.Identity, FNode.Series, FNode.StaticType);
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
@@ -74,8 +74,6 @@ type
|
|||||||
// Series
|
// Series
|
||||||
function VisitCreateSeries(const Node: IAstNode): TAstViewNode;
|
function VisitCreateSeries(const Node: IAstNode): TAstViewNode;
|
||||||
function VisitAddSeriesItem(const Node: IAstNode): TAstViewNode;
|
function VisitAddSeriesItem(const Node: IAstNode): TAstViewNode;
|
||||||
function VisitSeriesLength(const Node: IAstNode): TAstViewNode;
|
|
||||||
|
|
||||||
// Pipes
|
// Pipes
|
||||||
function VisitPipe(const Node: IAstNode): TAstViewNode;
|
function VisitPipe(const Node: IAstNode): TAstViewNode;
|
||||||
|
|
||||||
@@ -161,7 +159,6 @@ begin
|
|||||||
// Series
|
// Series
|
||||||
Register(akCreateSeries, VisitCreateSeries);
|
Register(akCreateSeries, VisitCreateSeries);
|
||||||
Register(akAddSeriesItem, VisitAddSeriesItem);
|
Register(akAddSeriesItem, VisitAddSeriesItem);
|
||||||
Register(akSeriesLength, VisitSeriesLength);
|
|
||||||
|
|
||||||
// Pipes (Simplified)
|
// Pipes (Simplified)
|
||||||
Register(akPipe, VisitPipe);
|
Register(akPipe, VisitPipe);
|
||||||
@@ -345,11 +342,6 @@ begin
|
|||||||
Result := TAstViewNode.Create(Self, TAddSeriesItemNodeHandler.Create(Node.AsAddSeriesItem));
|
Result := TAstViewNode.Create(Self, TAddSeriesItemNodeHandler.Create(Node.AsAddSeriesItem));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TAstVisualizer.VisitSeriesLength(const Node: IAstNode): TAstViewNode;
|
|
||||||
begin
|
|
||||||
Result := TAstViewNode.Create(Self, TSeriesLengthNodeHandler.Create(Node.AsSeriesLength));
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TAstVisualizer.VisitPipe(const Node: IAstNode): TAstViewNode;
|
function TAstVisualizer.VisitPipe(const Node: IAstNode): TAstViewNode;
|
||||||
begin
|
begin
|
||||||
Result := TAstViewNode.Create(Self, TPipeNodeHandler.Create(Node.AsPipe));
|
Result := TAstViewNode.Create(Self, TPipeNodeHandler.Create(Node.AsPipe));
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ type
|
|||||||
function GetCycleID: Int64;
|
function GetCycleID: Int64;
|
||||||
{$endregion}
|
{$endregion}
|
||||||
|
|
||||||
// Now requires a Definition when creating a channel
|
|
||||||
function GetInputChannel(const Name: string; const Def: IScalarRecordDefinition): IInputChannel;
|
function GetInputChannel(const Name: string; const Def: IScalarRecordDefinition): IInputChannel;
|
||||||
procedure Step;
|
procedure Step;
|
||||||
property CycleID: Int64 read GetCycleID;
|
property CycleID: Int64 read GetCycleID;
|
||||||
|
|||||||
Reference in New Issue
Block a user