From 8b610f2bcfc223333254ce9679730c42dce6d26e Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Mon, 3 Nov 2025 23:41:31 -0800 Subject: add createFn --- src/lang/ks-lang/index.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/lang/ks-lang/index.ts (limited to 'src/lang/ks-lang/index.ts') diff --git a/src/lang/ks-lang/index.ts b/src/lang/ks-lang/index.ts new file mode 100644 index 0000000..c60203f --- /dev/null +++ b/src/lang/ks-lang/index.ts @@ -0,0 +1,27 @@ +import { callFn, emptyStackFrame, evaluate, lex, parse } from "../js-lang"; +import { + Evaluate, + FnPrim, + Lex, + Parse, + EvalError, + CallFn, + EmptyStackFrame, +} from "../ts-lang"; + +export const createFn = ( + program: Program +): Evaluate>> extends [infer ProgramFn extends FnPrim] + ? ( + ...args: Args + ) => CallFn + : EvalError<"Cannot create a function from a program that does not eval to a function"> => { + const [programFn] = evaluate(parse(lex(program))) as Array; + if (!programFn.fn) { + throw new Error( + "Cannot create a function from a program that does not eval to a function" + ); + } + + return ((...args: any[]) => callFn(programFn, args, emptyStackFrame)) as any; +}; -- cgit v1.2.3-70-g09d2