rslt ← pick ##.of F of G of H ... arg ⍝ Pick'th fn applied to arg. [pick] is a ⎕IO-sensitive index into the "vector of" monadic functions": F G ··. The [pick]th function is applied to [arg]. If [pick] is out-of-bounds, [arg] is returned unmodified. Technical note: The operator code looks like this: of←{ ⍝ pick of F of G of H ... arg. indx rslt←⍺⍺{ ⍝ 'countdown' and received result. 2=⎕NC'⍺⍺':⍺⍺ ⍵ ⍝ left leaf of tree: pick-index and arg. 'int'⍺⍺ ⍵ ⍝ intermediate level: recur left. }⍵ next←(⍵⍵⍣(⎕IO=indx))rslt ⍝ apply ⍵⍵ if at right level. ⍺←'top' ⍝ missing ⍺ => top level. ⍺≡'top':next ⍝ top level: return result. (indx-1)next ⍝ otherwise: index and rslt. } As with the →case← operator, although the sequence: (p of F of G of H ··· arg) might look linear, in fact it represents a derived function _tree_: ┌─··· arg ┌─of─┐ ┌─of─┐ H ┌─of─┐ G pick F [of] traverses the left "spine" of this tree until it finds a left operand that is not a function and so must be the [pick] index. It returns this [indx] and the value of the argument ⍵, as the "current" result. [indx] is decremented as, together with the result, it is passed back up the tree. When and if [indx] matches ⎕IO, the target level has been reached and the [next] result passed back is: ⍵⍵ ⍵. A final twist is that, at the top of the derived function tree, [indx] must be discarded from the (index next) pair. This is achieved by using ⍺ to signal an intermediate depth in the tree and defaulting it to 'top'. Examples: 1 of + of - of × of ÷ 10 ⍝ +10 10 2 of + of - of × of ÷ 10 ⍝ -10 ¯10 3 of + of - of × of ÷ 10 ⍝ ×10 1 4 of + of - of × of ÷ 10 ⍝ ÷10 0.1 5 of + of - of × of ÷ 10 ⍝ 10 (out of range index returns arg). 10 See also: case Function_arrays pow case co_ops Back to: contents Back to: Workspaces