rslt ← count (fun ##.pow) argt ⍝ Explicit function power. Monadic operand function: [fun] is applied cumulatively [count] times to the argument. NB: Dyalog implements [pow] as primitive operator ⍣, though with a slightly different assignment of arguments and operands. Technical notes: There are a number of ways to code this operator. One that perhaps first springs to mind, uses tail recursion with a guard: pow←{ ⍝ Explicit function power. ⍺=0:⍵ ⍝ zero count: finished. (⍺-1)∇ ⍺⍺ ⍵ ⍝ tail call with reduced count. } Another, possibly due to Alan Graham, uses ⍎ and ⍕ to produce the expression: ⍺⍺ ⍺⍺ ⍺⍺ ... ⍺⍺ ⍵. Note that an unquoted (but unreferenced) ⍺⍺ must be included to make it an operator: pow←{⍎(⍕⍺⍴⊂'⍺⍺'),'⍵' ⋄ ⍺⍺} The following coding was provided by Phil Last. pow←{↑⊢∘⍺⍺/(⍳⍺),⊂⍵} ⍝ Explicit function power. Here's how it works: The composition: ⊢∘⍺⍺ is a _function_, which applies ⍺⍺ to its right argument and ignores its left one. For example: 12 ⊢∘÷ 2 4 ⍝ reciprocal of 2 4 (the 12 is ignored). 0.5 0.25 1 ⊢∘÷ 2 ⊢∘÷ 2 4 ⍝ reciprocal of reciprocal of 2 4 (1 2 ignored). 2 4 ↑ ⊢∘÷ / 1 2 (2 4) ⍝ recoding of the above using reduction /. 2 4 ↑ ⊢∘÷ / (⍳2),⊂2 4 ⍝ same as above. 2 4 Notice in the above, that only the _number_ of items in (⍳2) is significant as item values are ignored. The expression is therefore ⎕IO independent. Choosing an index origin of 1, we can transform the body of the operator in the following steps: ↑⊢∘⍺⍺/(⍳⍺),⊂⍵ ⍝ body of the operator. → ↑⊢∘⍺⍺/1 2 ... ⍺ ⍵ ⍝ (⍳⍺) → 1 2 ... ⍺ → 1 ⊢∘⍺⍺ 2 ⊢∘⍺⍺ ... ⊢∘⍺⍺ ⍺ ⊢∘⍺⍺ ⍵ ⍝ expanding the reduction /. → ⊢∘⍺⍺ ⊢∘⍺⍺ ... ⊢∘⍺⍺ ⊢∘⍺⍺ ⍵ ⍝ left arguments ignored. → ⍺⍺ ⍺⍺ ... ⍺⍺ ⍺⍺ ⍵ ⍝ cumulative applications of ⍺⍺. The following related function uses monadic commute: acc←{↑⊢∘(,∘⊂∘⍺⍺∘⊃∘⌽⍨)/(⍳⍺),⊂⊂⍵} ⍝ ⍺-accumulator. 3 (1∘+) acc 10 ⍝ 10 and 3 successors. 10 11 12 13 Examples: 6 {'<',⍵,'>'} pow 'wow' <<<<<<wow>>>>>> display 4 ⊂pow 'wow' ┌───────────────────┐ │ ┌───────────────┐ │ │ │ ┌───────────┐ │ │ │ │ │ ┌───────┐ │ │ │ │ │ │ │ ┌→──┐ │ │ │ │ │ │ │ │ │wow│ │ │ │ │ │ │ │ │ └───┘ │ │ │ │ │ │ │ └∊──────┘ │ │ │ │ │ └∊──────────┘ │ │ │ └∊──────────────┘ │ └∊──────────────────┘ display 6 ↑∘,∘⊂ pow 'hello' ⍝ 6-fold increase in rank. ┌┌┌┌┌┌→────┐ ↓↓↓↓↓↓hello│ └└└└└└─────┘ {⍬⍴ ⍵ {1↓⍵,+/⍵} pow 0 1}¨ 0 to 10 ⍝ Fibonacci numbers. 0 1 1 2 3 5 8 13 21 34 55 {⍬⍴⌽ ⍵ {1++\+\⍵} pow 0 0}¨ 0 to 10 ⍝ squares. 0 1 4 9 16 25 36 49 64 81 100 See also: for to limit inverse traj while until Back to: contents Back to: Workspaces