rslt ← (fn ##.vwise) ref ⍝ Variable-wise: apply ⍺⍺ to each var in space ⍵.
Suggested by Paul Mansour, [vwise] applies its operand function to each variable
in the namespace referenced by right argument ⍵.
Note that any non-primitive functions in vwise's operand will execute in the
_calling_, rather than the _target_ space.
Paul suggests some related operators: "Furthermore, we need a way to operate on
each sub namespace in a namespace, which suggests swise, or "space wise":
swise←{ ⍝ Space wise
⍺⍺¨refs ⍵ ⍝ Apply to each space
}
It is convenient to have variations of these operators that do replacement:
vwiser←{ ⍝ Var wise, with Replacement
n←↓⍵.⎕NL 2 ⍝ Var Names
v←⍺⍺¨⍵∘⍎¨n ⍝ Apply to each
⍵⊣n ⍵.{⍎⍺,'←⍵'}¨v ⍝ Reset vars
}
and
swiser←{ ⍝ Space wise with replacement
↑⍺⍺¨refs ⍵ ⍝ Apply to each space
}
Note that we could have one version of each operator and control their behavior
with a left argument, but this increases the complexity of the syntax when call-
ing them.
With operator "saw" (simple-array-wise) and these new operators, we can get to
work on an arbitrary namespace structure. Here is an example that finds and re-
places "words" in each simple text vector of a namespace ns:
f←ft rt∘ssword ⍝ Find and replace
g←f saw ⍝ ... in each simple array
h←g vwiser ⍝ ... in every variable
h swiser ns ⍝ ... in every space
where ft is the find text, rt is the replace text, and ssword is a slightly re-
worked version of its DFNS namesake.
Or simply rotate every variable in and under namespace A:
⌽ vwiser swiser A
or display the contents all variables in and under A:
⊢ vwise swise A
It appears vwise and swise are used in together a lot, so it might be useful to
combine them in a single operator:
vswise←{ ⍝ Var and Space Wise
⍺⍺ vwise swise ⍵ ⍝ ...
}
and
vswiser←{ ⍝ Var and Space Wise
⍺⍺ vwiser swiser ⍵ ⍝ ...
}
Count the number of simple matrices in every item of every variable in and under
A:
+/∊{2=⍴⍴⍵}saw vswise A
Rotate every matrix, simple or nested, in and under A:
{2=⍴⍴⍵:⌽⍵ ⋄ ⍵} vswiser A
Examples:
+/{82=⎕dr ⍵}vwise notes ⍝ number of simple char vars in #.
150
∧/{⍵≡vtrim ⍵}vwise notes ⍝ check that all notes have been trimmed.
1
~1∊(' ',⎕tc)∊{⊃⌽⍵}vwise notes ⍝ check no trailing white space in notes.
1
∪{⊢⎕cs''}vwise notes ⍝ operand function runs in calling space.
#
See also: refs xrefs saw
Back to: contents
Back to: Workspaces