diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-10-25 23:04:48 -0400 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-10-25 23:04:48 -0400 |
commit | 2987f69f690d8433ad3aaa9e9f41949455ada2cb (patch) | |
tree | b08a9038924133265563690bab95ac8b6d79fc17 /match.c | |
parent | 4e61cfe45d3fa26f73870c0242798c9d42eb5baf (diff) | |
download | txr-2987f69f690d8433ad3aaa9e9f41949455ada2cb.tar.gz txr-2987f69f690d8433ad3aaa9e9f41949455ada2cb.tar.bz2 txr-2987f69f690d8433ad3aaa9e9f41949455ada2cb.zip |
* filter.c (function_filter): Function removed.
(get_filter): Treat (:fun ...) syntax as a single function
call with extra arguments, currying it up as curried function that
invokes match_funcall once.
* match.c (match_funcall): Extended to take a list of the
additional arguments from get_filter. Adds these to the
function call form generated for the v_func call.
* match.h (match_funcall): Declaration updated.
* txr.1: Function Filter additional arguments documented.
Diffstat (limited to 'match.c')
-rw-r--r-- | match.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -2819,14 +2819,17 @@ repeat_spec_same_data: return cons(c.bindings, if3(c.data, cons(c.data, c.data_lineno), t)); } -val match_funcall(val name, val arg) +val match_funcall(val name, val arg, val other_args) { cons_bind (in_spec, in_bindings, uw_get_match_context()); spec_bind (specline, spec_linenum, first_spec, in_spec); - val arg1_sym = make_sym(lit("arg1")), arg2_sym = make_sym(lit("arg2")); - val bindings = cons(cons(arg1_sym, arg), in_bindings); + val in_arg_sym = make_sym(lit("in_arg")); + val out_arg_sym = make_sym(lit("out_arg")); + val bindings = cons(cons(in_arg_sym, arg), in_bindings); val spec = cons(list(spec_linenum, - list(name, arg1_sym, arg2_sym, nao), nao), nil); + cons(name, + cons(in_arg_sym, cons(out_arg_sym, other_args))), + nao), nil); match_files_ctx nc; (void) first_spec; @@ -2834,17 +2837,17 @@ val match_funcall(val name, val arg) if (ret == nil) sem_error(spec_linenum, lit("filter: (~s ~s ~s) failed"), name, - arg, arg2_sym, nao); + arg, out_arg_sym, nao); if (ret == decline_k) sem_error(spec_linenum, lit("filter: function ~s not found"), name, nao); { - val out = assoc(nc.bindings, arg2_sym); + val out = assoc(nc.bindings, out_arg_sym); if (!out) sem_error(spec_linenum, lit("filter: (~s ~s ~s) did not bind ~s"), name, - arg, arg2_sym, arg2_sym, nao); + arg, out_arg_sym, out_arg_sym, nao); return cdr(out); } } |