| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
New functions list, append and eval. Code walking framework for
expanding quasiquotes. quotes right now.
* eval.c (let_s, lambda_s, call_s, cond_s, if_s, and_s, or_s
defvar_s, defun_s, list_s, append_s): New symbol variables.
(eval_intrinsic, op_quote, expand_forms, expand_cond_pairs,
expand_place, expand_qquote): New static functions.
(expand): New external function.
(eval_init): Initialize new symbol variables. Use newly defined symbol
variables to register functions. Also, new functions: quote, append,
list and eval.
* eval.h (expand): Declared.
* lib.c (appendv): New function.
(obj_init): quote and splice operator symbols moved into system
package.
(obj_print, obj_pprint): Support for printing quotes and splices.
* lib.h (appendv): Declared.
* match.c (do_s): New symbol variable.
(syms_init): New variable initialized.
(dir_tales_init): New variable used instead of intern.
* match.h (do_s): Declared.
* parser.y (elem): @(do) form recognized and its argument passed
through the new expander.
(o_elem, quasi_item): Pass list through expander.
(list): Use choose_quote to decide whether to put
regular quote or quasiquote on quoted list.
(meta_expr): Fixed abstract syntax so the expression is a single
argument of the sys:expr, rather than multiple arguments.
(unquotes_occur, choose_quote): New static function.
|
|
|
|
|
|
|
|
|
|
|
| |
Lisp expressions can be interpolated into quasiliterals.
(extract_vars): Avoid recursing into expressions marked
with expr_s.
(do_output_line): Handle expr_s so that Lisp expressions
can be interpolated into output.
* parser.y (o_elem, quasi_items): Handle list expressions,
annotated with expr_s.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Lisp interpreter added.
* gc.c (finalize, mark_obj): Handle ENV objects.
* hash.c (struct hash): acons_new_l_fun function
pointer order of arguments change.
(equal_hash): Handle ENV.
(make_hash, gethash_l): Use cobj_handle for
type safety. Follow change in acons_new_l.
(gethash, gethash_f, remhash, hash_count,
hash_get_userdata, hash_set_userdata, hash_next): Use cobj_handle.
(gethash_n): New function.
* hash.h (gethash_n): Declared.
* lib.c (env_s): New symbol variable.
(code2type, equal): Handle ENV. (plusv, minusv, mul, mulv, trunc, mod,
gtv, ltv, gev, lev, maxv, minv, int_str): New functions.
(rehome_sym): New static function.
(func_f0, func_f1, func_f2, func_f3, func_f4, func_n0, func_n1,
func_n2, func_n3, func_n4): Initialize new fields of struct func.
(func_f0v, func_f1v, func_f2v, func_f3v, func_f4v,
func_n0v, func_n1v, func_n2v, func_n3v, func_n4v,
func_interp): New functions.
(apply): Function removed: sanely re-implemented in new eval.c file.
(funcall, funcall1, funcall2, funcall3, funcall4): Handle
variadic and interpreted functions.
(acons, acons_new, acons_new_l, aconsq_new, aconsq_new_l): Reordered
arguments for compatibility with Common Lisp acons.
(obj_init): Special hack to prepare hash_s symbol, which is
needed for type checking inside the hash table funtions invoked
by make_package, at a time when the symbol is not yet interned.
Initialize new env_s variable.
(obj_print, obj_pprint): Handle ENV. Fix confusing rendering of
of function type.
(init): Call new function eval_init.
* lib.h (enum type): New enumeration member ENV.
(struct func): functype member changed to bitfield.
New bitfied members minparam and variadic.
New members in f union: f0v, f1v, f2v, f3v,
f4v, n0v, n1v, n2v, n3v, n4v.
(struct env): New type.
(union obj): New member e of type struct env.
(env_s): Variable declared.
(plusv, minusv, mul, mulv, trunc, mod, gtv, ltv, gev, lev, maxv, minv,
|
|
|
|
|
| |
the case that :vars is explicitly specified as (). In this
case, no bindings escape from the collect.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib.h (getplist_f): Declared.
* match.c (v_collect, h_coll): Use getplist_f to distinguish
the case that :vars is explicitly specified as (). In this
case, no bindings escape from the collect.
* tests/008/soundex.txr: This test case broke due to using
:vars () and yet counting on the variable to exist.
* RELNOTES: Updated.
|
|
|
|
| |
generated function call.
|
|
|
|
|
|
|
|
|
| |
fire for inputs that do not overflow.
* match.c (search_form): Fixed incorrect loop test which could
lead to nonterminating behavior.
* RELNOTES: Updated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
of text and regular expressions, that whole mixture is
considered to follow the variable and used for matching.
The earlier semantics change whereby a single unescaped
space denotes the regular expression / +/ broke the
simple case @a word. It caused the @a to be followed
not by the text " word" but by just the regular expression
element.
With this change @a word means that a is followed by
the regex / +/ and "word".
* match.c (text_s): New symbol variable.
(h_text): New function.
(syms_init): Initialize new symbol variable.
(dir_tables_init): Hook h_text into horizontal directives table.
* match.h (text_s): Declared.
* parser.y (text, texts): New nonterminals.
(elem): TEXT, SPACE and regex are now handled under texts
grammar production. All texts are run together and produce
an item which looks like (text items ...).
* txr.1, RELNOTES: Updated.
* txr.c (remove_hash_bang_line): Updated to find #! buried
in (text ...) syntax.
|
|
|
|
|
|
|
|
|
|
| |
position after the end of the line, otherwise we can never match
@(eol).
(h_eol): Bugfix: do not return t, but the line length.
* txr.1: Warn users about @var@(bind ...) pitfall.
* RELNOTES: Updated.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* match.c (h_coll, v_collect): Only throw an error about
missing required variables if the collect iteration collected some new
variables. This allows strict collects with :vars to have
some cases which explicitly match and skip unwanted material,
without binding variables. Also, print all missing variables in the
diagnostic.
* txr.1: Mention this special exception.
* RELNOTES: Updated.
|
|
|
|
|
|
|
| |
* match.c (h_skip): Bugfix. Return the length of the line if
the skip is to the end of line, not the value t.
* txr.1: Clarify that @var@(skip)text is useless.
|
|
|
|
|
|
|
|
| |
the arguments individually. Now @(deffilter a b ..)
is possible where these evaluate to suitable
lists of strings.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib.c (cdr_f): New global variable.
(funcall1, funcall2, funcall3, funcall4): Fix unterminated
arguments in uw_throwf call by using uw_throw instead.
(do_or): New static function.
(orf): New function.
(obj_init): gc_protect and initialize cdr_f.
* lib.h (cdr_f, orf): Declared.
* match.c (v_deffilter): Treat the table as forms to be evaluated which
must reduce to strings, rather than literal strings.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* match.c (resolve_k): New keyword symbol variable.
(h_parallel, v_parallel): Implement :resolve keyword in @(some)
directive.
(syms_init): New symbol variable initialized.
* parser.l: Allow (some) to have argument material.
* parser.y (some_clause, elem): SOME syntax adjusted.
* txr.1: Documented new :resolve keyword in @(some).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
the bindings, not copy_alist. Otherwise functions cannot destructively
update a binding, which is useless. We want a function not to
manipulate the binding list, but to be able to manipulate the
contents of bindings.
(match_files_ctx): Declaration moved ahead of match_line.
(v_fun): Forward declaration added.
(match_line): Allow vertical functions to be called from
a horizontal context, in a limited way.
* txr.1: Mention the possibility of a call from a horizontal
context falling back on a vertical function.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* match.c (search_form): bugfix: return correct match extent.
* parser.y: Adjusting associativity and precedence of directives, IDENT,
and grouping tokens once again. This is so that a var followed by
a directive will turn into one elem, rather than the var being
reduced to an elem first.
* txr.1: Revised documentation to mroe clearly define the concept
of a negative match, broken into subsections. Some sections
belonging to syntax were moved to an appropriate location.
Subsections added to description of form syntax.
Explanation of directive-driven syntax.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Function calls following variables have searching semantics.
* match.c (ml_specline_pos, search_form): New static functions.
(h_var): Handle functions and regexes in a common way.
* parser.y: Adjusted precedence of IDENT and ( so that
@var@(func) are parsed into a single var element.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
source locatio info.
(v_skip): Don't use specline for trace messages, because
it may be nil. Use the skip spec.
* parser.h (rl): Declared.
(rlcp): New inline function.
* parser.y (rl): Static declaration removed. Function becomes
extern.
(clause): Propagate location info from clause to clause list
backbone.
(collect_clause, COLL): Bugfix: car/cdr mixup in location info.
(elem): Use rlcp function to abbreviate code.
(o_elems_opt, o_elems_opt2, o_elem): Set location info.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
and the trailing material silently ignored.
For instance @(bind a 1)@(bind b 2). This was going to v_bind,
v_bind does not check for the trailing material and doe snot
call decline_s. The result was that b was not bound.
Correct behavior is to process these binds in match_line.
* match.c (match_line): Check if a directive IS found in the vertical
table, and if so report a different error message. The fallback
case is that there is no such function or directive.
(v_next): Do not check for obsolete syntax any more. This case
will not occur any more due to the following changes.
(match_files): Do not defer opening the file if the data starts
with an incorrectly written next directive.
Do not look up and process a vertical directive or function
call if it is followed by more material in the same line.
Thus vertical directives can longer receive trailing material.
This fixes the bug of horizontal directives being treated as
vertical
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Makefile (OBJS): New object file debug.o.
* dep.mk: Updated.
* match.c (h_fun): Use debug_begin and debug_end macros
to set up a debug frame for backtracing.
(match_line, match_files): Call debug_check to give debugger a chance
to instrument call.
(v_fun): Use debug_begin and debug_end macros to set up a debug frame
for backtracing. Call debug_check to give debugger a chance to
instrument call.
* stream.c (struct strm_ops): New function pointer, flush.
(stdio_maybe_write_error): Wrong word in error message corrected.
(stdio_flush): New static function.
(stdio_ops, pipe_ops): New function entered into tables.
(flush_stream): New function.
* stream.h (flush_stream): Declared.
* txr.c (help): New options documented.
(main): call to debug_init added. New debug options parsed and
opt_debugger set accordingly.
* unwind.c (uw_push_debug, uw_current_frame): New function.
* unwind.h (uw_frtype): New enumeration member UW_DBG.
(struct uw_debug): New frame variant.
(union uw_frame): New member, db.
(uw_push_debug, uw_current_frame): Declared,
* debug.c: New file.
* debug.h: New file.
|
|
|
|
|
|
|
|
|
| |
"Eliminate line numbers from the abstract syntax
tree representation of the TXR query."
* match.c (match_funcall): Remove spurious object being
added to the front of a form where a line number used
to be.
|
|
|
|
| |
* txr.c: Likewise.
|
|
|
|
|
|
| |
* match.c (v_freeform): Fail if the data is null,
to avoid a false positive match as an empty line, followed by the type
error of incrementing a nonexistent data line number.
|
|
|
|
|
|
|
|
| |
* match.c (debugf): Function removed.
(dest_bind, v_output, v_eof): Use debuglf instead of
debugf, and sem_error instead of uw_throwf.
(match_files): Likewise, and file_err is called
with form.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
tree representation of the TXR query.
* match.c (debuglf, sem_error, file_err, eval_form): Line number argument replaced
with the form to which the situation pertains. Location information is
pulled from the hash table entry associated with the form.
(dest_set, dest_bind, eval_form, vars_to_bindings): Context argument
renamed since it isn't a line number.
(struct match_line_ctx): spec_lineno member removed.
(ml_all, ml_bindings_specline): lineno parameter removed.
(LOG_MISMATCH, LOG_MATCH, h_var, h_skip, h_coll, h_parallel,
match_line): Pass elem to debuglf instead of line number.
as context.
(h_trailer, h_eol): define elem for LOG_MISMATCH and LOG_MATCH macros.
(h_fun): Pass elem variable to debuglf instead of line number.
Body stored as a simple cons cell once again (no line number).
(do_output_line): Line number parameter removed. Pass specline to
sem_error instead of line number.
(do_output): Adjusted for one less parameter in do_output_line.
(mf_from_ml): Pass one less parameter to ml_all. Conversion of
specline to spec is just a wrapping into a nested list,
with no line number.
(spec_bind): Linenumber variable parameter removed from macro.
Definition simplified.
(v_skip): Pass specline to debuglf instead of spec_linenum,
which is no longer computed.
(v_trailer): Use new definition of specline. Pass first_spec
to sem_error instead of spec_linenum.
Computation of ff_specline no longer has to skip line number.
(v_freeform, v_block, v_accept_fail, v_next, v_parallel, v_gather,
v_collect, v_merge, v_bind, hv_trampoline, v_cat, v_output,
v_try, v_defex, v_throw, v_deffilter, v_filter, match_funcall): Use new
definition of specline. Pass first_spec to sem_error instead of
spec_linenum. (v_forget_local): Specline computed differently since
there is no linenumber to skip.
(h_define): Back to implified representation of function with
no extra cell for line number.
(v_define, v_fun): Pass first_spec to sem_error instead of
spec_linenum. Back to implified representation of function with no
extra cell for line number.
(match_files): first_spec_item computed differently.
Pass first_spec to sem_error instead of spec_linenum.
* parser.h (source_loc): Declared.
* parser.l (source_loc): New function.
* parser.y:x (grammar): Removed line numbers from abstract sytnax
tree. A few more places needed the annotation of forms with location
info, and a couple of cases of the need to propagate the info was
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
outside of the code, in hash tables.
* filter.c (make_trie, trie_add): Update to three-argument
make_hash.
* hash.c (struct hash): New members, hash_fun, assoc_fun
acons_new_l_fun.
(ll_hash): Renamed to equal_hash.
(eql_hash): New static function.
(cobj_hash_op): Follows ll_hash rename.
(hash_grow): Use new function indirection to call hashing function.
(make_hash): New argument to specify type of hashing. Initialize new
members of struct hash.
(gethash_l, gethash, remhash): Use function indirection for hashing and
chain search and update.
(pushhash): New function.
* hash.h (make_hash): Declaration updated with new parameter.
(pushhash): Declared.
* lib.c (eql_f): New global variable.
(eql, assq, aconsq_new, aconsq_new_l): New functions.
(make_package): Updated to new three-argument make_hash.
(obj_init): gc-protect and initialize new variable eql_f.
* lib.h (eql, assq, aconsq_new, aconsq_new_l): Declared.
* match.c (dir_tables_init): Updated to there-argument make_hash.
* parser.h (form_to_ln_hash, ln_to_forms_hash): Global variables
declared.
* parser.l (form_to_ln_hash, ln_to_forms_hash): New global variables.
(grammar): Set yylval.lineno for tokens that are classified to
that type in parser.y.
(parse_init): Initialize and gc-protect new global variables.
* parser.y (rl): New static helper function.
(%union): New member, lineno.
(ALL, SOME, NONE, MAYBE, CASES, CHOOSE, GATHER,
AND, OR, END, COLLECT, UNTIL, COLL, OUTPUT, REPEAT,
REP, SINGLE, FIRST, LAST, EMPTY, DEFINE,
TRY, CATCH, FINALLY, ERRTOK, '('): Reclassified as lineno type.
In the grammar, these keywords can thus provide a stable line number
from the lexer.
(grammar): Numerous rules updated to add constructs to the
line number hash tables via the rl helper.
* dep.mk: Updated.
* Makefile (depend): Use the installed, stable txr in the
system path to update dependencies rather than locally built ./txr, to
prevent the problem that txr is broken because out out-of-date
dependencies, and thus cannot regenerate dependencies.
|
|
|
|
|
|
|
|
|
|
|
| |
reported to caller line number.
* match.c (ml_bindings_specline): Extended with extra argument
(h_coll): Pass nil for new argument of ml_bindings_specline.
(h_fun): Extract line number from stored function.
Pass line number to ml_bindings_specline.
(h_define, v_define): Store function as a cons cell containing
the line number and body.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
variables moved from parser.l.
(opt_lisp_bindings): New variable.
(dump_bindings): Dump Lisp syntax bindings
on standard output if opt_lisp_bindings is set.
(v_cat): Do not complain about trailing material;
this is not compatible with horizontal cat.
* parser.l (opt_nobindings, opt_arraydims): Moved
to match.c.
* txr.c (txr_main): New options, --lisp-bindings
and the equivalent -l.
* txr.h: opt_lisp_bindings declared.
|
|
|
|
|
|
|
| |
* match.c (dir_tables_init): Mapping flatten_s, forget_s,
local_s, merge_s, set_s, cat_s and filter_s to hv_trampoline
function, thereby making all these directives work in
horizontal contexts in one fell swoop.
|
|
|
|
|
|
|
|
|
| |
More generic approach.
* match.c (h_bind): Function removed.
(hv_trampoline): New function.
(dir_tables_init): hv_trampoline installed in
h_directive_table instead of h_bind.
|
|
|
|
|
|
|
| |
the function call, decline it; it is a horizontal context.
* txr.1: Discussion and examples of calls that are
in a horizontal context.
|
|
|
|
|
|
|
| |
@(bind) in horizontal mode.
* match.c (mf_from_ml, h_bind): New functions.
(dir_tables_init): h_bind entered into table.
|
|
|
|
| |
function calls.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* match.c (h_fun): New function.
(match_line): Rearranged not to do hash lookup if the directive is a
regex or list. If hash lookup fails, try it as a horizontal function.
(h_define): New function. Handles horizontal function syntax embedded
in line.
(v_define): Handle the horizontal function syntax occuring
on a line by itself. The function info is now stored as a cons cell
whose car is the vertical function and cdr the horizontal one.
(v_fun): Adjust to new function storage convention.
(dir_tables_init): h_define entered in table.
* parser.y: Added syntax for horizontal define.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* match.c (noval_s): New symbol variable.
(vars_to_bindings): Use a default value of noval_s to indicate a
required variable, rather than nil, which would not allow
an optional variable with a default value of nil.
(h_coll, v_collect): Check default value against noval_s, rather than nil.
(v_gather): Support :vars keyword.
(syms_init): Initialize new symbol variable.
* txr.1: Documented gather's :vars parameter.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* match.c (gather_s): New keyword variable.
(v_gather): New function.
(syms_init): gather_s initialized.
(dir_tables_init): v_gather entered into table.
* match.h (gather_s): Declared.
* parser.l: GATHER token scanning added.
* parser.y: GATHER token added. gather_clause nonterminal added.
* txr.1: New directive documented.
* txr.vim: gather keyword introduced.
|
|
|
|
| |
directive not included in dispatch table.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib.c (env_list): New static variable.
(env): New function.
(match): Declaration of nonexistent function removed.
(obj_init): New variable gc-protected.
* lib.h (env): Declared.
* match.c (env_k): New symbol variable.
(v_next): Implemented :env.
* txr.1: @(next :env) described.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Changing the parameter passing convention for vertical directives.
They take one parameter which is a pointer, rather than a copy
of the structure. They do not have to perform a structure
assignment when returning next_spec_k.
* match.c (v_match_func): Typedef updated to new function
signature.
(v_skip, v_trailer, v_freeform, v_block, v_accept, v_accept, v_next,
v_parallel, v_collect, v_flatten, v_forget, v_forget, v_merge, v_bind,
v_set, v_cat, v_output, v_define, v_try, v_defex, v_throw, v_deffilter,
v_filter, v_eof, v_fun): Refactored.
(match_files): Updated dispatch logic to new style calls.
(match_funcall): Updated to new way of calling v_fun.
|
|
|
|
| |
* tests/001/query-3.txr: Updated to new cat syntax.
|
|
|
|
|
|
| |
* match.c (v_cat): Rewritten.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
(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.
|
|
|
|
|
|
|
|
| |
(v_filter): New function.
(syms_init): New symbol variable initialized.
(dir_tables_init): New function entered into table.
* txr.1: Documented new filter directive.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
replacement text.
* filter.c (build_filter_from_list): Allow tuples to denote
multiple keys mapping to the same value.
* lib.c (do_curry_123_2, do_curry_123_1): New static functions.
(curry_123_2, curry_123_1): New functions.
* lib.h (curry_123_2, curry_123_1): New functions declared.
* match.c (v_deffilter): Allow tuples of strings rather than
just pairs.
* txr.1: Updated.
|
|
|
|
| |
info.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
(get_filter): Handle (fun ...) syntax.
* match.c (v_bind): Establish dynamic environment frame around
dest_bind, and stash the bindings there so filters can have access
to the bindings.
(v_output): Likewise, around do_output calls.
(v_fun): New function.
(match_files): Function handling broken out into v_fun.
(match_funcall): New function.
* match.h (match_funcall): Declared.
* unwind.c (uw_push_env): Initialize match_context.
(uw_get_match_context, uw_set_match_context): New functions.
* unwind.h (struct uw_dynamic_env): New member, match_context.
(uw_get_match_context, uw_set_match_context): Declared.
* txr.1: Documented function filters.
|
|
|
|
|
|
|
|
| |
(v_next): Implement :list and :string keywords.
(syms_init): New keyword variables initialized.
NOTE: the :var keyword is deprecated.
* txr.1: Documented :list and :string.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* filter.c (filter_equal): Takes two filters instead of one.
(lfilt_k, rfilt_k): New keyword variables.
(filter_init): New keyword variables initialized.
* filter.h (filter_equal): Declaration updated.
(lfilt_k, rfilt_k): Declared.
* lib.c (funcall4): New function.
(do_curry_1234_34): New static function.
(curry_1234_34): New function.
(do_swap_12_21): New static function.
(swap_12_21): New function.
* lib.h (funcall4, curry_1234_34, swap_12_21): Declared.
* match.c (dest_bind): Swap use the function argument swapping
combinator when calling tree find such that the value
being searched is on the left and pattern material is on the right.
(v_bind): Implemented :lfilt and :rfilt.
* txr.1: Documented :lfilt and :rfilt.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
is not necessarily a trie.
(string_filter, compound_filter): New functions.
(get_filter): Recognize a compound filters and return a function
which implements it.
* filter.h (get_filter_trie): Declaration renamed.
* match.c (format_field, v_bind, v_output): Follow get_filter_trie
rename. Error message text updated.
* txr.1: Describe compound filters.
|