diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-06-19 07:19:16 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-06-19 07:19:16 -0700 |
commit | b4bac608774c37350c91233d58578617d352004e (patch) | |
tree | 9273eb07dbb63cede662ffa776ef954c73d775ac /eval.c | |
parent | 990b739d9f20664aa62ec23fb9458953a5fb2cd4 (diff) | |
download | txr-b4bac608774c37350c91233d58578617d352004e.tar.gz txr-b4bac608774c37350c91233d58578617d352004e.tar.bz2 txr-b4bac608774c37350c91233d58578617d352004e.zip |
* eval.c (me_ap): New static function.
(eval_init): Use new list_f instead of func_n0v(identity).
Register multi as intrinsic. Register me_ap as ap macro.
* lib.c (list_f): New global variable.
(multi): New function.
(multi_sort): Use list_f in place of func_n0v(identity).
(obj_init): gc-protect and initialize list_f.
* lib.h (list_f, multi): Declared.
* txr.1: Documented multi and ap.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 14 |
1 files changed, 13 insertions, 1 deletions
@@ -2367,6 +2367,16 @@ static val me_op(val form, val menv) } } +static val me_ap(val form, val menv) +{ + /* We do not use an op to generate the outer lambda, because + it wouldn't be hygienic; this hidden op would capture @@n + references from the body of the ap form. */ + val args = gensym(lit("args-")); + return list(lambda_s, cons(args, nil), + list(apply_s, cons(op_s, rest(form)), args, nao), nao); +} + static val expand_catch_clause(val form, val menv) { val sym = first(form); @@ -3201,6 +3211,7 @@ void eval_init(void) reg_mac(intern(lit("delay"), user_package), me_delay); reg_mac(op_s, me_op); reg_mac(do_s, me_op); + reg_mac(intern(lit("ap"), user_package), me_ap); reg_mac(qquote_s, me_qquote); reg_mac(sys_qquote_s, me_qquote); reg_mac(intern(lit("pprof"), user_package), me_pprof); @@ -3223,7 +3234,7 @@ void eval_init(void) reg_fun(intern(lit("replace-list"), user_package), func_n4o(replace_list, 2)); reg_fun(append_s, func_n0v(appendv)); reg_fun(intern(lit("append*"), user_package), func_n0v(lazy_appendv)); - reg_fun(list_s, func_n0v(identity)); + reg_fun(list_s, list_f); reg_fun(intern(lit("list*"), user_package), func_n0v(list_star_intrinsic)); reg_fun(intern(lit("identity"), user_package), identity_f); reg_fun(intern(lit("typeof"), user_package), func_n1(typeof)); @@ -3290,6 +3301,7 @@ void eval_init(void) reg_fun(intern(lit("some"), user_package), func_n3o(some_satisfy, 1)); reg_fun(intern(lit("all"), user_package), func_n3o(all_satisfy, 1)); reg_fun(intern(lit("none"), user_package), func_n3o(none_satisfy, 1)); + reg_fun(intern(lit("multi"), user_package), func_n1v(multi)); reg_fun(intern(lit("eq"), user_package), eq_f); reg_fun(intern(lit("eql"), user_package), eql_f); reg_fun(intern(lit("equal"), user_package), equal_f); |