diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lang/builtin/sbuiltin.ts | 10 | ||||
| -rw-r--r-- | src/lang/core/common.ts | 15 | ||||
| -rw-r--r-- | src/lang/core/eval.ts | 39 |
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>; |
