summaryrefslogtreecommitdiff
path: root/src/lang/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/lang/core')
-rw-r--r--src/lang/core/common.ts15
-rw-r--r--src/lang/core/eval.ts39
2 files changed, 27 insertions, 27 deletions
diff --git a/src/lang/core/common.ts b/src/lang/core/common.ts
index c1a1dc3..9e3840b 100644
--- a/src/lang/core/common.ts
+++ b/src/lang/core/common.ts
@@ -55,3 +55,18 @@ export type ParserCtx = {
lastToken: Token | null;
stack: readonly ASTNode[];
};
+
+export type StackFrame<
+ Bindings extends Record<ASTNode["name"], any> = Record<ASTNode["name"], any>,
+ Parent extends StackFrame | null = any
+> = {
+ bindings: Bindings;
+ parent: Parent;
+};
+
+export type EmptyStackFrame = StackFrame<{}, null>;
+
+export type WithPushedBindings<
+ OldFrame extends StackFrame,
+ Bindings extends StackFrame["bindings"]
+> = StackFrame<Bindings, OldFrame>;
diff --git a/src/lang/core/eval.ts b/src/lang/core/eval.ts
index 258999a..3dcf9b0 100644
--- a/src/lang/core/eval.ts
+++ b/src/lang/core/eval.ts
@@ -7,21 +7,10 @@ import {
SBUILTIN_Map,
} from "../builtin";
import { ToString } from "../util";
-import { ASTNode, NodeType } from "./common";
+import { ASTNode, EmptyStackFrame, NodeType, StackFrame } from "./common";
import { Lex } from "./lexer";
import { Parse } from "./parser";
-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;
-
export type SENTINEL_NO_BUILTIN = "__NO_BUILTIN__";
export type MapBuiltins<
Node extends ASTNode,
@@ -44,21 +33,6 @@ export type MapBuiltins<
export type EvalError<T extends string> = `Eval error: ${T}`;
-export type StackFrame<
- Bindings extends Record<ASTNode["name"], any> = Record<ASTNode["name"], any>,
- Parent extends StackFrame | null = any
-> = {
- bindings: Bindings;
- parent: Parent;
-};
-
-export type EmptyStackFrame = StackFrame<{}, null>;
-
-export type WithPushedBindings<
- OldFrame extends StackFrame,
- Bindings extends StackFrame["bindings"]
-> = StackFrame<Bindings, OldFrame>;
-
export type FindInStack<
Frame extends StackFrame,
NameToFind
@@ -117,6 +91,17 @@ export type Evaluate<
: 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(5,5,5), fn(n, add(n, 1)))` as const;
const lex_result = null as unknown as Lex<typeof input>;
const parse_result = null as unknown as Parse<typeof lex_result>;