summaryrefslogtreecommitdiff
path: root/src/lib/core/eval.ts
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2025-10-29 21:48:51 -0700
committerKai Stevenson <kai@kaistevenson.com>2025-10-29 21:48:51 -0700
commit5e0bcc45037b6cf9345ed3e290bd8a4b2c387587 (patch)
tree73fd04314d94a0aae35981ce1032f68c50370004 /src/lib/core/eval.ts
parent2326b6ce7d9135dc350d2005f75bf89584750d39 (diff)
arrays
Diffstat (limited to 'src/lib/core/eval.ts')
-rw-r--r--src/lib/core/eval.ts16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/lib/core/eval.ts b/src/lib/core/eval.ts
index 10cc23c..74801bf 100644
--- a/src/lib/core/eval.ts
+++ b/src/lib/core/eval.ts
@@ -26,6 +26,10 @@ export type UnarrayIfOnlyHead<T extends readonly any[]> = T extends [
? Head
: T;
+export type BUILTIN_ARR<Args extends readonly ASTNode[]> = {
+ [Idx in keyof Args]: Args[Idx] extends ASTNode ? Evaluate<Args[Idx]> : never;
+};
+
export type BUILTIN_ToString<Args extends readonly ASTNode[]> = ToStringInner<
UnarrayIfOnlyHead<{
[Idx in keyof Args]: Args[Idx] extends ASTNode
@@ -38,25 +42,19 @@ export type BUILTIN_ToString<Args extends readonly ASTNode[]> = ToStringInner<
export type SENTINEL_NO_BUILTIN = "__NO_BUILTIN__";
export type MapBuiltins<Node extends ASTNode> = Node["name"] extends "tostring"
? BUILTIN_ToString<Node["children"]>
+ : Node["name"] extends "arr"
+ ? BUILTIN_ARR<Node["children"]>
: SENTINEL_NO_BUILTIN;
export type EvalError<T extends string> = `Eval error: ${T}`;
export type Evaluate<Node extends ASTNode> = Node["type"] extends NodeType.INT
? Node["value"]
- : Node["type"] extends NodeType.ROOT
- ? Node["children"] extends infer Children extends readonly ASTNode[]
- ? UnarrayIfOnlyHead<{
- [Idx in keyof Children]: Children[Idx] extends ASTNode
- ? Evaluate<Children[Idx]>
- : never;
- }>
- : EvalError<`Unexpected error parsing children of ${Node["type"]}`>
: Node["type"] extends NodeType.EXT
? MapBuiltins<Node>
: EvalError<`Unhandled node type ${Node["type"]}`>;
-const input = `tostring(5, 2)` as const;
+const input = `5, arr(5000)` as const;
const lex_result = null as unknown as Lex<typeof input>;
const parse_result = null as unknown as Parse<typeof lex_result>;
const eval_result = null as unknown as Evaluate<typeof parse_result>;