Recursive pattern matching, introduced and illustrated for computing
factorial in §2.23 above, also gives a powerful way to
define a block diagram recursively in terms of its partitions. For
example, the following FAUST program defines Hadamard matrices of
order
where
is a positive integer:
bus(n) = par(i,n,_); // There is si.bus(n) in the \FL s //hmtx(2) = _,_ <: +,-; // scalar butterfly hmtx(2) = _,_ <: (bus(2):>_),(_,*(-1):>_) ; // prettier drawing hmtx(n) = bus(n) <: (bus(n):>bus(n/2)) , // vector butterfly ((bus(n/2),(bus(n/2):par(i,n/2,*(-1)))) :> bus(n/2)) : (hmtx(n/2) , hmtx(n/2)); process = hmtx(16); // look at the diagram in the Faust Editor, e.g.Other examples include Feedback Delay Networks (FDN) and the square waveguide mesh of order
See also basics.lib for examples of using recursion for a kind of list processing, such as in count and take.
Note that it is also possible to implement counterparts to par and seq using pattern matching (see the duplicate function on page 14 of the FaustQR.