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; };