summaryrefslogtreecommitdiff
path: root/src/lang/core/eval.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lang/core/eval.ts')
-rw-r--r--src/lang/core/eval.ts111
1 files changed, 0 insertions, 111 deletions
diff --git a/src/lang/core/eval.ts b/src/lang/core/eval.ts
deleted file mode 100644
index 9181c81..0000000
--- a/src/lang/core/eval.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import {
- BUILTIN_Add,
- BUILTIN_Arr,
- BUILTIN_Mul,
- BUILTIN_ToString,
- SBUILTIN_Call,
- SBUILTIN_Map,
-} from "../builtin";
-import { ToString } from "../util";
-import { ASTNode, EmptyStackFrame, NodeType, StackFrame } from "./common";
-import { Lex } from "./lexer";
-import { Parse } from "./parser";
-
-export type SENTINEL_NO_BUILTIN = "__NO_BUILTIN__";
-export type MapBuiltins<
- Node extends ASTNode,
- Frame extends StackFrame
-> = GetEvaluatedChildren<Node, Frame> extends infer Args extends readonly any[]
- ? Node["name"] extends "call"
- ? SBUILTIN_Call<Node, Frame>
- : Node["name"] extends "map"
- ? SBUILTIN_Map<Node, Frame>
- : Node["name"] extends "tostring"
- ? BUILTIN_ToString<Args>
- : Node["name"] extends "arr"
- ? BUILTIN_Arr<Args>
- : Node["name"] extends "add"
- ? BUILTIN_Add<Args>
- : Node["name"] extends "mul"
- ? BUILTIN_Mul<Args>
- : SENTINEL_NO_BUILTIN
- : never;
-
-export type EvalError<T extends string> = `Eval error: ${T}`;
-
-export type FindInStack<
- Frame extends StackFrame,
- NameToFind
-> = NameToFind extends keyof Frame["bindings"]
- ? Frame["bindings"][NameToFind]
- : Frame["parent"] extends null
- ? EvalError<`Can't find name "${ToString<NameToFind>}" on the stack`>
- : FindInStack<Frame["parent"], NameToFind>;
-
-export type MapOnStack<
- Node extends ASTNode,
- Frame extends StackFrame
-> = FindInStack<Frame, Node["name"]>;
-
-export type FnPrim<
- Args extends readonly ASTNode[] = readonly ASTNode[],
- Fn extends ASTNode = ASTNode
-> = { args: Args; fn: Fn };
-
-export type HandleFn<Node extends ASTNode> = Node["children"] extends [
- ...infer Args extends ASTNode[],
- infer Fn extends ASTNode
-]
- ? FnPrim<Args, Fn>
- : never;
-
-export type MapZip<
- T extends readonly ASTNode[],
- U extends readonly PropertyKey[]
-> = {
- [Idx in Exclude<
- keyof T,
- keyof any[]
- > as T[Idx] extends infer Node extends ASTNode
- ? Node["name"]
- : never]: Idx extends keyof U ? U[Idx] : never;
-};
-
-export type CallFn<
- Fn extends FnPrim,
- Values extends readonly any[],
- Frame extends StackFrame
-> = Evaluate<Fn["fn"], StackFrame<MapZip<Fn["args"], Values>, Frame>>;
-
-export type Evaluate<
- Node extends ASTNode,
- Frame extends StackFrame = EmptyStackFrame
-> = Node["type"] extends NodeType.INT
- ? Node["value"]
- : Node["type"] extends NodeType.EXT
- ? // special builtin
- Node["name"] extends "fn"
- ? HandleFn<Node>
- : MapBuiltins<Node, Frame> extends infer BI
- ? BI extends SENTINEL_NO_BUILTIN
- ? MapOnStack<Node, Frame>
- : BI
- : never
- : EvalError<`Unhandled node type ${Node["type"]}`>;
-
-export type GetEvaluatedChildren<
- Node extends ASTNode,
- Frame extends StackFrame
-> = Node["children"] extends infer Children extends readonly ASTNode[]
- ? {
- [Idx in keyof Children]: Children[Idx] extends ASTNode
- ? Evaluate<Children[Idx], Frame>
- : never;
- }
- : never;
-
-const input =
- `map(arr("hello", "world"), fn(s, i, add(tostring(i), ":", s)))` 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>;