From 2353379f9842ccccefb52b4c530bfb113b5d4a18 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sun, 2 Nov 2025 17:53:39 -0800 Subject: add "add" --- src/lib/core/eval.ts | 70 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 14 deletions(-) (limited to 'src/lib') diff --git a/src/lib/core/eval.ts b/src/lib/core/eval.ts index 74801bf..65e4788 100644 --- a/src/lib/core/eval.ts +++ b/src/lib/core/eval.ts @@ -26,25 +26,67 @@ export type UnarrayIfOnlyHead = T extends [ ? Head : T; -export type BUILTIN_ARR = { - [Idx in keyof Args]: Args[Idx] extends ASTNode ? Evaluate : never; -}; +export type NumberToArray< + Number extends number, + Carry extends readonly any[] = [] +> = Number extends Carry["length"] + ? Carry + : NumberToArray; -export type BUILTIN_ToString = ToStringInner< +export type NumbersToArray< + Numbers extends readonly number[], + Carry extends readonly any[] = [] +> = Numbers extends [ + infer Head extends number, + ...infer Tail extends readonly number[] +] + ? NumbersToArray]> + : Carry; + +export type AddNumbers = + NumbersToArray extends infer T extends readonly any[] + ? T["length"] + : never; + +export type AddStrings< + Strings extends readonly string[], + Carry extends string = "" +> = Strings extends [infer Head extends string, ...infer Tail extends string[]] + ? AddStrings + : Carry; + +export type BUILTIN_Arr = Args; + +export type BUILTIN_ToString = ToStringInner< UnarrayIfOnlyHead<{ - [Idx in keyof Args]: Args[Idx] extends ASTNode - ? ToStringInner> - : never; + [Idx in keyof Args]: ToStringInner; }> >; -// export type BUILTIN_Print + +export type BUILTIN_Add = + Args extends readonly string[] + ? AddStrings + : Args extends readonly number[] + ? AddNumbers + : FnError<`Cannot add operands ${ToStringInner}`>; export type SENTINEL_NO_BUILTIN = "__NO_BUILTIN__"; -export type MapBuiltins = Node["name"] extends "tostring" - ? BUILTIN_ToString - : Node["name"] extends "arr" - ? BUILTIN_ARR - : SENTINEL_NO_BUILTIN; +export type MapBuiltins = + Node["children"] extends infer Children extends readonly ASTNode[] + ? { + [Idx in keyof Children]: Children[Idx] extends ASTNode + ? Evaluate + : never; + } extends infer Args extends readonly any[] + ? Node["name"] extends "tostring" + ? BUILTIN_ToString + : Node["name"] extends "arr" + ? BUILTIN_Arr + : Node["name"] extends "add" + ? BUILTIN_Add + : SENTINEL_NO_BUILTIN + : never + : never; export type EvalError = `Eval error: ${T}`; @@ -54,7 +96,7 @@ export type Evaluate = Node["type"] extends NodeType.INT ? MapBuiltins : EvalError<`Unhandled node type ${Node["type"]}`>; -const input = `5, arr(5000)` as const; +const input = `add(1,2,3,4,5)` as const; const lex_result = null as unknown as Lex; const parse_result = null as unknown as Parse; const eval_result = null as unknown as Evaluate; -- cgit v1.2.3-70-g09d2