rslt ← {left} (fun ##.saw) {right} ⍝ Apply function Simple-Array-Wise.
The function operand is applied to or between each simple (depth 0 or 1) sub-
array in the argument(s). [saw] is thought to have been published first by IBM's
Ed Eusebi, who remarked that "It's good to have a saw in your toolbox".
Technical notes:
A monadic version of the operator tests the depth of its argument and applies
the operand function if it is simple. Otherwise, it recursively applies the
derived function '∇' (function operand bound with operator), to each sub array.
saw←{ ⍝ Function operand applied Simple-Array-Wise.
1≥|≡⍵:⍺⍺ ⍵ ⍝ Simple: apply operand.
∇¨⍵ ⍝ Nested: visit each sub-array.
}
Phil Last suggested this (⎕io- and ⎕ml-independent) one-liner:
saw←{⊃⍬⍴⊢∘∇¨/(1↓1 0~≡⍵),⊢∘⍺⍺/(1 0∩≡⍵),⊂⍵}
A dyadic version, suggested by Paul Mansour, looks like this:
saw←{ ⍝ Function operand applied Simple-Array-Wise.
2≥|≡⍺ ⍵:⍺ ⍺⍺ ⍵ ⍝ Both simple: apply operand.
1≥|≡⍵:∇∘⍵¨⍺ ⍝ ⍵ simple: traverse ⍺.
1≥|≡⍺:⍺∘∇¨⍵ ⍝ ⍺ simple: traverse ⍵.
⍺ ∇¨⍵ ⍝ Both nested: traverse both.
}
Dyadic [saw] is a close relative of the pervasion operator →perv←. See the tech-
nical notes in →perv← for a generalisation that includes both.
Finally, we can produce an ambi-valent version, by defaulting a missing left
argument to the identity function {⍵}.
saw←{ ⍝ Function operand applied Simple-Array-Wise.
⍺←{⍵} ⍝ default left arg.
2≥|≡⍺ ⍵ ⍵:⍺ ⍺⍺ ⍵ ⍝ Both simple: apply operand.
1≥|≡⍵:⍺ ∇¨⊂⍵ ⍝ ⍵ simple: traverse ⍺.
2≥|≡⍺ 1:⍺∘∇¨⍵ ⍝ ⍺ simple: traverse ⍵.
⍺ ∇¨⍵ ⍝ Both nested: traverse both.
}
Example:
disp¨eng esp ⍝ two nested vectors.
┌→──┬─┬─┬─┬────┐ ┌→──┬───┬────┬─┬─┐
│One│ │ │ │Five│ │Uno│Dos│Tres│ │ │
└──→┴⊖┴⊖┴⊖┴───→┘ └──→┴──→┴───→┴⊖┴⊖┘
disp ⌽saw eng esp ⍝ _monadic_ saw on depth-3 array.
┌→───────────────┬──────────────────┐
│┌→──┬─┬─┬─┬────┐│┌→──┬───┬────┬─┬─┐│
││enO│ │ │ │eviF│││onU│soD│serT│ │ ││
│└──→┴⊖┴⊖┴⊖┴───→┘│└──→┴──→┴───→┴⊖┴⊖┘│
└───────────────→┴─────────────────→┘
disp eng {⍺,'=',⍵}saw esp ⍝ _dyadic_ saw between depth-2 arrays.
┌→──────┬────┬─────┬─┬─────┐
│One=Uno│=Dos│=Tres│=│Five=│
└──────→┴───→┴────→┴→┴────→┘
fnb←{' '^.=⍺:⍵ ⋄ ⍺}saw ⍝ Paul Mansour's [fnb] function.
disp eng fnb esp ⍝ eng replaces esp simple-array-wise.
┌→──┬───┬────┬─┬────┐
│One│Dos│Tres│ │Five│
└──→┴──→┴───→┴⊖┴───→┘
disp ↑fnb/ eng esp '¿?' ⍝ eng replaces esp with default: '¿?'.
┌→──┬───┬────┬──┬────┐
│One│Dos│Tres│¿?│Five│
└──→┴──→┴───→┴─→┴───→┘
See also: perv rows
Back to: contents
Back to: Workspaces
Trouble seeing APL font?