From 490b9c94fba16f484be3bb58b8a4a4880b9396bc Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Thu, 6 Nov 2025 00:18:26 -0800 Subject: implement recursion properly with closures --- src/lang/ks-lang/index.ts | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'src/lang/ks-lang') diff --git a/src/lang/ks-lang/index.ts b/src/lang/ks-lang/index.ts index e5a78b9..772c9c9 100644 --- a/src/lang/ks-lang/index.ts +++ b/src/lang/ks-lang/index.ts @@ -23,13 +23,23 @@ export const createFn = () => ( program: Program - ): Evaluate>> extends [infer ProgramFn extends FnPrim] - ? TransformArgs extends ArgsConstraint - ? ( - ...args: Args - ) => CallFn - : EvalError<`Program's args do not extend args constraint`> - : EvalError<"Cannot create a function from a program that does not eval to a function"> => { + ): Evaluate>> extends infer E + ? E extends [infer ProgramFn extends FnPrim] + ? TransformArgs extends ArgsConstraint + ? ( + ...args: Args + ) => CallFn + : EvalError<`Program's args do not extend args constraint`> + : E extends readonly [ + readonly [infer Prim extends FnPrim, infer StackFrame, infer Name] + ] + ? TransformArgs extends ArgsConstraint + ? ( + ...args: Args + ) => CallFn + : EvalError<`Program's args do not extend args constraint`> + : EvalError<"Cannot create a function from a program that does not eval to a function"> + : never => { const [programFn] = evaluate(parse(lex(program))) as Array; if (!programFn.fn) { throw new Error( -- cgit v1.2.3-70-g09d2