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 subarray. } Phil Last suggested this (⎕io-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│││ └───┴┴┴┴────┘ └───┴───┴────┴┴┘ ⌽saw eng esp ⍝ _monadic_ saw on depth-3 array. ┌─────────────┬────────────────┐ │┌───┬┬┬┬────┐│┌───┬───┬────┬┬┐│ ││enO││││eviF│││onU│soD│serT││││ │└───┴┴┴┴────┘│└───┴───┴────┴┴┘│ └─────────────┴────────────────┘ eng {⍺,'=',⍵}saw esp ⍝ _dyadic_ saw between depth-2 arrays. ┌───────┬────┬─────┬─┬─────┐ │One=Uno│=Dos│=Tres│=│Five=│ └───────┴────┴─────┴─┴─────┘ fnb←{' '∧.=⍺:⍵ ⋄ ⍺}saw ⍝ Paul Mansour's [fnb] function. eng fnb esp ⍝ eng replaces esp simple-array-wise. ┌───┬───┬────┬┬────┐ │One│Dos│Tres││Five│ └───┴───┴────┴┴────┘ ↑fnb/ eng esp '¿?' ⍝ eng replaces esp with default: '¿?'. ┌───┬───┬────┬──┬────┐ │One│Dos│Tres│¿?│Five│ └───┴───┴────┴──┴────┘ See also: perv rows Depth Back to: contents Back to: Workspaces