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 /txr.1 | |
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 'txr.1')
-rw-r--r-- | txr.1 | 47 |
1 files changed, 44 insertions, 3 deletions
@@ -3041,12 +3041,14 @@ A function can be used as a filter. For this to be possible, the function must conform to certain rules: .IP 1. -The function must take exactly two arguments. +The function must take two special arguments, which may be followed +by additional arguments. .IP 2. When the function is called, the first argument will be bound to a string, -and the second argument will be unbound. The function must produce a string -value by binding it to the second argument. +and the second argument will be unbound. The function must produce a +value by binding it to the second argument. If the filter is to be used +as the final filter in a chain, it must produce a string. For instance, the following is a valid filter function: @@ -3078,6 +3080,45 @@ Of course, function filters can be used in a chain: ... @(end) +Here is a split function which takes an extra argument. + + @(define split (in out sep)) + @ (next :list in) + @ (coll)@(maybe)@token@sep@(or)@token@(end)@(end) + @ (bind out token) + @(end) + +Furthermore, note that it produces a list rather than a string. +This function separates the argument in into tokens according to the +separator text sep. + +Here is another function, join, which catenates a list: + + @(define join (in out sep)) + @ (output :into out) + @ (rep)@in@sep@(last)@in@(end) + @ (end) + @(end) + +Now here is these two being used in a chain: + + @(bind text "how,are,you") + @(output :filter (:fun split ",") (:fun join "-")) + @text + @(end) + +Output: + + how-are-you + +When the filter invokes a function, it generates the first two arguments +internally to pass in the input value and capture the output. The remaining +arguments from the (:fun ...) construct are also passed to the function. +Thus the "," and "-" are passed as the sep argument to split and join. + +Note that split puts out a list, which join accepts. So the overall filter +chain operates on a string: a string goes into split, and a string comes out of +join. .SS The Deffilter Directive |