diff options
Diffstat (limited to 'src/lib/core/eval.ts')
| -rw-r--r-- | src/lib/core/eval.ts | 16 |
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>; |
