diff options
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 31 |
1 files changed, 27 insertions, 4 deletions
@@ -7108,11 +7108,34 @@ static val ipf(val fun, varg args) return func_f0v(dyn_args(args, fun, nil), do_args_ipf); } +static val do_callf(val dargs, varg inargs) +{ + val self = lit("callf"); + val func = dargs->a.car; + varg funlist = dargs->a.args; + cnum funcount = args_count(funlist, self); + cnum inacount = args_count(inargs, self); + args_decl(funargs, max(funcount, ARGS_MIN)); + args_decl(inargs_cp, max(inacount, ARGS_MIN)); + cnum index = 0; + + while ((args_copy(inargs_cp, inargs), args_more(funlist, index))) { + val afun = args_get(funlist, &index); + val arg = generic_funcall(afun, inargs_cp); + args_add(funargs, arg); + } + + return generic_funcall(func, funargs); +} + static val callf(val func, varg funlist) { - val juxt_fun = juxtv(funlist); - val apf_fun = apf(func, 0); - return chain(juxt_fun, apf_fun, nao); + return func_f0v(dyn_args(funlist, func, nil), do_callf); +} + +static val juxt(varg funlist) +{ + return callf(list_f, funlist); } static val do_mapf(val env, varg args) @@ -7778,7 +7801,7 @@ void eval_init(void) func_n2(lexical_lisp1_binding)); reg_fun(intern(lit("chain"), user_package), func_n0v(chainv)); reg_fun(intern(lit("chand"), user_package), func_n0v(chandv)); - reg_fun(intern(lit("juxt"), user_package), func_n0v(juxtv)); + reg_fun(intern(lit("juxt"), user_package), func_n0v(juxt)); reg_fun(intern(lit("andf"), user_package), func_n0v(andv)); reg_fun(intern(lit("orf"), user_package), func_n0v(orv)); reg_fun(intern(lit("notf"), user_package), func_n1(notf)); |