summaryrefslogtreecommitdiff
path: root/src/lang
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2025-11-02 20:07:43 -0800
committerKai Stevenson <kai@kaistevenson.com>2025-11-02 20:07:43 -0800
commit4dc08222b1b9160a699a03fca7cc0e21cc4bdece (patch)
tree8edb8f376df15d80a03e334a5bc66bc07ac05a4f /src/lang
parent5fdaa70d0af1356652de38f66fccef4bd3088a26 (diff)
cleanup
Diffstat (limited to 'src/lang')
-rw-r--r--src/lang/builtin/sbuiltin.ts10
-rw-r--r--src/lang/core/common.ts15
-rw-r--r--src/lang/core/eval.ts39
3 files changed, 29 insertions, 35 deletions
diff --git a/src/lang/builtin/sbuiltin.ts b/src/lang/builtin/sbuiltin.ts
index 704e688..f291de3 100644
--- a/src/lang/builtin/sbuiltin.ts
+++ b/src/lang/builtin/sbuiltin.ts
@@ -1,11 +1,5 @@
-import { ASTNode } from "../core/common";
-import {
- CallFn,
- FnPrim,
- GetEvaluatedChildren,
- StackFrame,
- EvalError,
-} from "../core/eval";
+import { ASTNode, StackFrame } from "../core/common";
+import { CallFn, FnPrim, GetEvaluatedChildren, EvalError } from "../core/eval";
import { ToString } from "../util";
export type SBUILTIN_Call<
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>;