@Section @Title { Filtered right and body parameters } @Tag { filters } @Begin @PP A right or body parameter may be filtered by some other computer program before being included by Lout. As an example of such a program we will use the Unix @Code sort command: @ID @Code "sort -o outfile infile" This causes file @Code outfile to contain a sorted copy of file {@Code infile}. We incorporate this into a Lout definition as follows: @ID @OneRow @Code { "def @Sort" " named @Options {}" " right x" "{" " def @Filter { sort @Options -o @FilterOut @FilterIn }" "" " lines @Break x" "}" } The presence within @Code "@Sort" of a definition of a symbol called @Code "@Filter" tells Lout that the right parameter of @Code "@Sort" is to be filtered before inclusion. When @Code "@Sort" is invoked, @Code "@Filter" is evaluated and its value executed as a system command. In addition to the symbols ordinarily available within the body of {@Code "@Filter"}, there are three others: @VeryWideTaggedList @TI { @Code "@FilterIn" } { the name of a file which will, at the time the system command is executed, contain the actual right or body parameter of the symbol, exactly as it appears in the input file; } @TI { @Code "@FilterOut" } { the name of a file of Lout text whose contents Lout will read after the system command has finished, as a replacement for what was put into file {@Code "@FilterIn"}; } @TI { @Code "@FilterErr" } { the name of a file that Lout will attempt to read after the system command has finished, containing error messages produced by the command that Lout will pass on to the user as non-fatal errors. Use of this file is optional. } @EndList It is a fatal error for the system command to return a non-zero status. @PP Now the @Code sort command has options @Code -u for deleting duplicate lines, and @Code -r for reversing the sorting order. So the result of @ID @OneRow @Code { "@Sort" " @Options { -r -u }" "{" "Austen, Jane" "Dickens, Charles" "Eliot, George" "Hardy, Thomas" "Bront{@Char edieresis}, Charlotte" "}" } is @ID @OneRow lines @Break { Hardy, Thomas Eliot, George Dickens, Charles Bront{@Char edieresis}, Charlotte Austen, Jane } Unlike all the other examples in this manual, this output is simulated. This was done so that the ability to format this manual is not dependent on the existence of the Unix {@Code "sort"} command, and it highlights the fact that filtered actual parameters are by their nature of uncertain portability. @PP There is no need for an actual filtered parameter to obey the lexical rules of Lout, since it is passed directly to the other program. However, Lout must be able to work out where the parameter ends, which gives rise to the following rules. As with a body parameter, a symbol @Code "@Sym" with a filtered parameter must be invoked in either the form @Code "@Sym { ... }" or the form {@Code "@Sym @Begin ... @End @Sym"}, plus options as usual. In the former case, braces within the actual parameter must match; in the latter case, the actual parameter may not contain {@Code "@End"}. @PP If an actual filtered parameter contains @@Include, this is taken to begin a Lout @@Include directive in the usual form (Section {@NumberOf include}): @ID @OneRow @Code { "@Sort {" "Austen, Jane" "@Include { authors }" "Hardy, Thomas" "}" } The included file becomes part of {@Code "@FilterIn"}, but any braces, @@Include, or @@End within it are not noticed by Lout. @PP The first character of file @Code "@FilterIn" will be the first non-white space character following the opening @Code "{" or @@Begin, or the first character of an included file if @@Include comes first. The second-last character of file @Code "@FilterIn" will be the last non-white space character preceding the closing @Code "}" or {@Code "@End @Sym"}, or the last character of an included file if @@Include comes last. One newline character is always appended and is the last character of file {@Code "@FilterIn"}. This effects a compromise between the Lout convention, that spaces following @Code "{" or preceding @Code "}" are not significant, with the Unix convention that all text files end with a newline character. @End @Section