rslt ← {larg} {''} ##.lof F lof G lof H ... rarg    ⍝ List of functions.

From Phil Last:

[lof] simulates the distribution of the argument(s) to a "list of functions".

         F lof G lof H ··· rarg  ←→  (F rarg)(G rarg)(H rarg) ···
    larg F lof G lof H ··· rarg  ←→  (larg F rarg)(larg G rarg)(larg H rarg) ···

Technical notes:

    lof←{                   ⍝ List of functions.
        ⍺←⊢                 ⍝ ambivalent.
        (⍺ ⍺⍺ ⍵),⊂⍺ ⍵⍵ ⍵    ⍝ one at a time.
    }

One  obstacle  is that the result from the leftmost function application must be
_enclosed_  prior to concatenation with the vector of results to its right. How-
ever,  it is not easy for the operator to determine when its left operand is the
leftmost.  One  way  to overcome it takes several lines of additional code to be
interpreted  at  each  iteration (level) and involves the analysis of the ⎕CR of
the derived function of itself by itself (not very nice really) so here we do it
by an additional, apparently redundant call to the operator with a constant null
function {''}. Using the example above we write:

    {''} lof F lof G lof H lof J array

As  we  go  down  the  tree,  each function in turn (J H G & F) is run as ⍵⍵ and
enclosed  while  ⍺⍺  gets  progressively  shallower  until it is just {''} whose
result is ineffectively catenated to the left of the combined result.

The null call is only strictly necessary when the result of what would otherwise
be the leftmost function is other than a simple scalar, a real possibility! This
is because the result of ⍺⍺ cannot be enclosed as it is the entire left spine of
the tree.

An alternative would be to provide a slightly different "special" coding for the
leftmost operator:

    _lof←{                  ⍝ Close list of functions.
        ⍺←⊢                 ⍝ ambivalent.
        (⍺ ⍺⍺ ⍵)(⍺ ⍵⍵ ⍵)    ⍝ one at a time.
    }

Examples:

    ⊃÷/ +/lof⍴ 1 2 3 4                              ⍝ arithmetic mean.
2.5
    cvex←'will' 'you' 'nill'                        ⍝ vector of vectors.

    {2↑⍵} lof {2↑⌽⍵} lof {⌽2↑⍵} cvex                ⍝ without left closure.
┌────┬───┬──────────┬──────────┐
│will│you│┌────┬───┐│┌───┬────┐│
│    │   ││nill│you│││you│will││
│    │   │└────┴───┘│└───┴────┘│
└────┴───┴──────────┴──────────┘

    {''} lof {2↑⍵} lof {2↑⌽⍵} lof {⌽2↑⍵} cvex       ⍝ explicit closure.
┌──────────┬──────────┬──────────┐
│┌────┬───┐│┌────┬───┐│┌───┬────┐│
││will│you│││nill│you│││you│will││
│└────┴───┘│└────┴───┘│└───┴────┘│
└──────────┴──────────┴──────────┘

    {2↑⍵} _lof {2↑⌽⍵} lof {⌽2↑⍵} cvex               ⍝ closure using [_lof].
┌──────────┬──────────┬──────────┐
│┌────┬───┐│┌────┬───┐│┌───┬────┐│
││will│you│││nill│you│││you│will││
│└────┴───┘│└────┴───┘│└───┴────┘│
└──────────┴──────────┴──────────┘

See also: vof Function_arrays truth_tables co_ops

Back to: contents

Back to: Workspaces