From 1d6ad5892120dd0ce3f1947ee87fe343fc932f0d Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 2 Feb 2014 15:22:49 -0800 Subject: append can now take additional leading arguments before the list. * eval.c (apply_frob_args): New static function. (apply_intrinsic): Process arguments with apply_frob_args. (eval_init): apply_intrinsic registered differently, as a variadic function with one mandatory arg. * lib.c (lastcons): New function. * lib.h (lastcons): Declared. * txr.1: Updated append documentation. --- eval.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 888c7e49..92922bd7 100644 --- a/eval.c +++ b/eval.c @@ -419,9 +419,20 @@ val apply(val fun, val arglist, val ctx_form) internal_error("corrupt function type field"); } +static val apply_frob_args(val args) +{ + val *plast = lastcons(args); + if (plast) { + *plast = car(*plast); + return args; + } else { + return car(args); + } +} + static val apply_intrinsic(val fun, val args) { - return apply(fun, args, cons(apply_s, nil)); + return apply(fun, apply_frob_args(args), cons(apply_s, nil)); } static val do_eval(val form, val env, val ctx_form, @@ -2384,7 +2395,7 @@ void eval_init(void) reg_fun(intern(lit("mapcar*"), user_package), func_n1v(lazy_mapcarv)); reg_fun(intern(lit("mappend"), user_package), func_n1v(mappendv)); reg_fun(intern(lit("mappend*"), user_package), func_n1v(lazy_mappendv)); - reg_fun(apply_s, func_n2(apply_intrinsic)); + reg_fun(apply_s, func_n1v(apply_intrinsic)); reg_fun(intern(lit("reduce-left"), user_package), func_n4o(reduce_left, 2)); reg_fun(intern(lit("reduce-right"), user_package), func_n4o(reduce_right, 2)); -- cgit v1.2.3