aboutsummaryrefslogtreecommitdiff
path: root/docs/doc/depth.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/doc/depth.html')
-rw-r--r--docs/doc/depth.html127
1 files changed, 37 insertions, 90 deletions
diff --git a/docs/doc/depth.html b/docs/doc/depth.html
index 92e05dd3..e141585c 100644
--- a/docs/doc/depth.html
+++ b/docs/doc/depth.html
@@ -64,128 +64,75 @@
</table>
<p>Functions such as Take and Drop use a single number per axis. When the left argument is a list of numbers, they apply to initial axes. But for convenience, a single number is also accepted, and applied to the first axis only. This is equivalent to ravelling the left argument before applying the function.</p>
<pre> <span class='Function'>≢</span><span class='Number'>2</span><span class='Function'>↑</span><span class='Number'>7</span><span class='Ligature'>‿</span><span class='Number'>7</span><span class='Ligature'>‿</span><span class='Number'>7</span><span class='Ligature'>‿</span><span class='Number'>7</span><span class='Function'>⥊</span><span class='String'>&quot;abc&quot;</span>
-2‿7‿7‿7
+⟨ 2 7 7 7 ⟩
<span class='Function'>≢</span><span class='Number'>2</span><span class='Ligature'>‿</span><span class='Number'>1</span><span class='Ligature'>‿</span><span class='Number'>1</span><span class='Function'>↑</span><span class='Number'>7</span><span class='Ligature'>‿</span><span class='Number'>7</span><span class='Ligature'>‿</span><span class='Number'>7</span><span class='Ligature'>‿</span><span class='Number'>7</span><span class='Function'>⥊</span><span class='String'>&quot;abc&quot;</span>
-2‿1‿1‿7
+⟨ 2 1 1 7 ⟩
</pre>
<p>In these cases the flexibility seems trivial because the left argument has depth 1 or 0: it is an array or isn't, and it's obvious what a plain number should do. But for the second row in the table, the left argument is always an array. The general case is that the left argument is a vector and its elements correspond to right argument axes:</p>
<pre> <span class='Bracket'>⟨</span><span class='Number'>3</span><span class='Ligature'>‿</span><span class='Number'>2</span><span class='Separator'>,</span><span class='Number'>1</span><span class='Ligature'>‿</span><span class='Number'>4</span><span class='Ligature'>‿</span><span class='Number'>1</span><span class='Bracket'>⟩</span> <span class='Function'>⊏</span> <span class='Function'>↕</span><span class='Number'>6</span><span class='Ligature'>‿</span><span class='Number'>7</span>
-┌───┬───┬───┐
-│3‿1│3‿4│3‿1│
-├───┼───┼───┤
-│2‿1│2‿4│2‿1│
-└───┴───┴───┘
+┌─
+╵ ⟨ 3 1 ⟩ ⟨ 3 4 ⟩ ⟨ 3 1 ⟩
+ ⟨ 2 1 ⟩ ⟨ 2 4 ⟩ ⟨ 2 1 ⟩
+ ┘
</pre>
<p>This means the left argument is homogeneous of depth 2. What should an argument of depth 1, or an argument that contains non-arrays, do? One option is to continue to require the left argument to be a list, and convert any non-array argument into an array by enclosing it:</p>
<pre> <span class='Bracket'>⟨</span><span class='Number'>3</span><span class='Ligature'>‿</span><span class='Number'>2</span><span class='Separator'>,</span><span class='Number'>1</span><span class='Bracket'>⟩</span> <span class='Function'>&lt;</span><span class='Modifier2'>⍟</span><span class='Paren'>(</span><span class='Number'>0</span><span class='Function'>=≡</span><span class='Paren'>)</span><span class='Modifier'>¨</span><span class='Modifier2'>⊸</span><span class='Function'>⊏</span> <span class='Function'>↕</span><span class='Number'>6</span><span class='Ligature'>‿</span><span class='Number'>7</span>
-┌───┬───┐
-│3‿1│2‿1│
-└───┴───┘
+⟨ ⟨ 3 1 ⟩ ⟨ 2 1 ⟩ ⟩
</pre>
<p>While very consistent, this extension represents a small convenience and makes it difficult to act on a single axis, which for Replicate and <a href="group.html">Group</a> is probably the most common way the primitive is used:</p>
<pre> <span class='Number'>3</span><span class='Ligature'>‿</span><span class='Number'>2</span><span class='Ligature'>‿</span><span class='Number'>1</span><span class='Ligature'>‿</span><span class='Number'>2</span><span class='Ligature'>‿</span><span class='Number'>3</span> <span class='Function'>/</span> <span class='String'>&quot;abcde&quot;</span>
-aaabbcddeee
+"aaabbcddeee"
</pre>
<p>With the extension above, every case like this would have to use <code><span class='Function'>&lt;</span><span class='Modifier2'>⊸</span><span class='Function'>/</span></code> instead of just <code><span class='Function'>/</span></code>. BQN avoids this difficulty by testing the left argument's depth. A depth-1 argument applies to the first axis only, giving the behavior above.</p>
<p>For Select, the depth-1 case is still quite useful, but it may also be desirable to choose a single cell using a list of numbers. In this case the left argument depth can be increased from the bottom using <code><span class='Function'>&lt;</span><span class='Modifier'>¨</span></code>.</p>
<pre> <span class='Number'>2</span><span class='Ligature'>‿</span><span class='Number'>1</span><span class='Ligature'>‿</span><span class='Number'>4</span> <span class='Function'>&lt;</span><span class='Modifier'>¨</span><span class='Modifier2'>⊸</span><span class='Function'>⊏</span> <span class='Function'>↕</span><span class='Number'>3</span><span class='Ligature'>‿</span><span class='Number'>4</span><span class='Ligature'>‿</span><span class='Number'>5</span><span class='Ligature'>‿</span><span class='Number'>2</span>
-┌───────┬───────┐
-│2‿1‿4‿0│2‿1‿4‿1│
-└───────┴───────┘
+⟨ ⟨ 2 1 4 0 ⟩ ⟨ 2 1 4 1 ⟩ ⟩
</pre>
<h2 id="the-depth-modifier">The Depth modifier</h2>
<p>The Depth 2-modifier (<code><span class='Modifier2'>⚇</span></code>) is a generalization of Each that allows diving deeper into an array. To illustrate it we'll use a shape <code><span class='Number'>4</span><span class='Ligature'>‿</span><span class='Number'>3</span></code> array of lists of lists.</p>
<pre> <span class='Function'>⊢</span> <span class='Value'>n</span> <span class='Gets'>←</span> <span class='Function'>&lt;</span><span class='Modifier2'>⎉</span><span class='Number'>1</span><span class='Modifier2'>⍟</span><span class='Number'>2</span> <span class='Number'>4</span><span class='Ligature'>‿</span><span class='Number'>3</span><span class='Ligature'>‿</span><span class='Number'>2</span><span class='Ligature'>‿</span><span class='Number'>2</span><span class='Function'>⥊↕</span><span class='Number'>48</span>
-┌─────────────┬─────────────┬─────────────┐
-│┌───┬───┐ │┌───┬───┐ │┌───┬─────┐ │
-││0‿1│2‿3│ ││4‿5│6‿7│ ││8‿9│10‿11│ │
-│└───┴───┘ │└───┴───┘ │└───┴─────┘ │
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││12‿13│14‿15│││16‿17│18‿19│││20‿21│22‿23││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││24‿25│26‿27│││28‿29│30‿31│││32‿33│34‿35││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││36‿37│38‿39│││40‿41│42‿43│││44‿45│46‿47││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-└─────────────┴─────────────┴─────────────┘
+┌─
+╵ ⟨ ⟨ 0 1 ⟩ ⟨ 2 3 ⟩ ⟩ ⟨ ⟨ 4 5 ⟩ ⟨ 6 7 ⟩ ⟩ ⟨ ⟨ 8 9 ⟩ ⟨ 10 11 ⟩ ⟩
+ ⟨ ⟨ 12 13 ⟩ ⟨ 14 15 ⟩ ⟩ ⟨ ⟨ 16 17 ⟩ ⟨ 18 19 ⟩ ⟩ ⟨ ⟨ 20 21 ⟩ ⟨ 22 23 ⟩ ⟩
+ ⟨ ⟨ 24 25 ⟩ ⟨ 26 27 ⟩ ⟩ ⟨ ⟨ 28 29 ⟩ ⟨ 30 31 ⟩ ⟩ ⟨ ⟨ 32 33 ⟩ ⟨ 34 35 ⟩ ⟩
+ ⟨ ⟨ 36 37 ⟩ ⟨ 38 39 ⟩ ⟩ ⟨ ⟨ 40 41 ⟩ ⟨ 42 43 ⟩ ⟩ ⟨ ⟨ 44 45 ⟩ ⟨ 46 47 ⟩ ⟩
+ ┘
<span class='Function'>≡</span> <span class='Value'>n</span>
3
</pre>
<p>Reversing n swaps all the rows:</p>
<pre> <span class='Function'>⌽</span> <span class='Value'>n</span>
-┌─────────────┬─────────────┬─────────────┐
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││36‿37│38‿39│││40‿41│42‿43│││44‿45│46‿47││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││24‿25│26‿27│││28‿29│30‿31│││32‿33│34‿35││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││12‿13│14‿15│││16‿17│18‿19│││20‿21│22‿23││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-├─────────────┼─────────────┼─────────────┤
-│┌───┬───┐ │┌───┬───┐ │┌───┬─────┐ │
-││0‿1│2‿3│ ││4‿5│6‿7│ ││8‿9│10‿11│ │
-│└───┴───┘ │└───┴───┘ │└───┴─────┘ │
-└─────────────┴─────────────┴─────────────┘
+┌─
+╵ ⟨ ⟨ 36 37 ⟩ ⟨ 38 39 ⟩ ⟩ ⟨ ⟨ 40 41 ⟩ ⟨ 42 43 ⟩ ⟩ ⟨ ⟨ 44 45 ⟩ ⟨ 46 47 ⟩ ⟩
+ ⟨ ⟨ 24 25 ⟩ ⟨ 26 27 ⟩ ⟩ ⟨ ⟨ 28 29 ⟩ ⟨ 30 31 ⟩ ⟩ ⟨ ⟨ 32 33 ⟩ ⟨ 34 35 ⟩ ⟩
+ ⟨ ⟨ 12 13 ⟩ ⟨ 14 15 ⟩ ⟩ ⟨ ⟨ 16 17 ⟩ ⟨ 18 19 ⟩ ⟩ ⟨ ⟨ 20 21 ⟩ ⟨ 22 23 ⟩ ⟩
+ ⟨ ⟨ 0 1 ⟩ ⟨ 2 3 ⟩ ⟩ ⟨ ⟨ 4 5 ⟩ ⟨ 6 7 ⟩ ⟩ ⟨ ⟨ 8 9 ⟩ ⟨ 10 11 ⟩ ⟩
+ ┘
</pre>
<p>Depth <code><span class='Number'>¯1</span></code> is equivalent to Each, and reverses the larger vectors, while depth <code><span class='Number'>¯2</span></code> applies Each twice to reverse the smaller vectors:</p>
<pre> <span class='Function'>⌽</span><span class='Modifier2'>⚇</span><span class='Number'>¯1</span> <span class='Value'>n</span>
-┌─────────────┬─────────────┬─────────────┐
-│┌───┬───┐ │┌───┬───┐ │┌─────┬───┐ │
-││2‿3│0‿1│ ││6‿7│4‿5│ ││10‿11│8‿9│ │
-│└───┴───┘ │└───┴───┘ │└─────┴───┘ │
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││14‿15│12‿13│││18‿19│16‿17│││22‿23│20‿21││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││26‿27│24‿25│││30‿31│28‿29│││34‿35│32‿33││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││38‿39│36‿37│││42‿43│40‿41│││46‿47│44‿45││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-└─────────────┴─────────────┴─────────────┘
+┌─
+╵ ⟨ ⟨ 2 3 ⟩ ⟨ 0 1 ⟩ ⟩ ⟨ ⟨ 6 7 ⟩ ⟨ 4 5 ⟩ ⟩ ⟨ ⟨ 10 11 ⟩ ⟨ 8 9 ⟩ ⟩
+ ⟨ ⟨ 14 15 ⟩ ⟨ 12 13 ⟩ ⟩ ⟨ ⟨ 18 19 ⟩ ⟨ 16 17 ⟩ ⟩ ⟨ ⟨ 22 23 ⟩ ⟨ 20 21 ⟩ ⟩
+ ⟨ ⟨ 26 27 ⟩ ⟨ 24 25 ⟩ ⟩ ⟨ ⟨ 30 31 ⟩ ⟨ 28 29 ⟩ ⟩ ⟨ ⟨ 34 35 ⟩ ⟨ 32 33 ⟩ ⟩
+ ⟨ ⟨ 38 39 ⟩ ⟨ 36 37 ⟩ ⟩ ⟨ ⟨ 42 43 ⟩ ⟨ 40 41 ⟩ ⟩ ⟨ ⟨ 46 47 ⟩ ⟨ 44 45 ⟩ ⟩
+ ┘
<span class='Function'>⌽</span><span class='Modifier2'>⚇</span><span class='Number'>¯2</span> <span class='Value'>n</span>
-┌─────────────┬─────────────┬─────────────┐
-│┌───┬───┐ │┌───┬───┐ │┌───┬─────┐ │
-││1‿0│3‿2│ ││5‿4│7‿6│ ││9‿8│11‿10│ │
-│└───┴───┘ │└───┴───┘ │└───┴─────┘ │
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││13‿12│15‿14│││17‿16│19‿18│││21‿20│23‿22││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││25‿24│27‿26│││29‿28│31‿30│││33‿32│35‿34││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-├─────────────┼─────────────┼─────────────┤
-│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
-││37‿36│39‿38│││41‿40│43‿42│││45‿44│47‿46││
-│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
-└─────────────┴─────────────┴─────────────┘
+┌─
+╵ ⟨ ⟨ 1 0 ⟩ ⟨ 3 2 ⟩ ⟩ ⟨ ⟨ 5 4 ⟩ ⟨ 7 6 ⟩ ⟩ ⟨ ⟨ 9 8 ⟩ ⟨ 11 10 ⟩ ⟩
+ ⟨ ⟨ 13 12 ⟩ ⟨ 15 14 ⟩ ⟩ ⟨ ⟨ 17 16 ⟩ ⟨ 19 18 ⟩ ⟩ ⟨ ⟨ 21 20 ⟩ ⟨ 23 22 ⟩ ⟩
+ ⟨ ⟨ 25 24 ⟩ ⟨ 27 26 ⟩ ⟩ ⟨ ⟨ 29 28 ⟩ ⟨ 31 30 ⟩ ⟩ ⟨ ⟨ 33 32 ⟩ ⟨ 35 34 ⟩ ⟩
+ ⟨ ⟨ 37 36 ⟩ ⟨ 39 38 ⟩ ⟩ ⟨ ⟨ 41 40 ⟩ ⟨ 43 42 ⟩ ⟩ ⟨ ⟨ 45 44 ⟩ ⟨ 47 46 ⟩ ⟩
+ ┘
</pre>
<p>While a negative depth tells how many levels to go down, a non-negative depth gives the maximum depth of the argument before applying the left operand. On a depth-3 array like above, depth <code><span class='Number'>2</span></code> is equivalent to <code><span class='Number'>¯1</span></code> and depth <code><span class='Number'>1</span></code> is equivalent to <code><span class='Number'>¯2</span></code>. A depth of <code><span class='Number'>0</span></code> means to loop until non-arrays are reached, that is, apply <a href="https://aplwiki.com/wiki/Pervasion">pervasively</a>, like a scalar function.</p>
<pre> <span class='Bracket'>⟨</span><span class='String'>'a'</span><span class='Separator'>,</span><span class='String'>&quot;bc&quot;</span><span class='Bracket'>⟩</span> <span class='Function'>≍</span><span class='Modifier2'>⚇</span><span class='Number'>0</span> <span class='Bracket'>⟨</span><span class='Number'>2</span><span class='Ligature'>‿</span><span class='Number'>3</span><span class='Separator'>,</span><span class='Number'>4</span><span class='Bracket'>⟩</span>
-┌─────────────┬─────────────┐
-│┌─────┬─────┐│┌─────┬─────┐│
-││'a'‿2│'a'‿3│││'b'‿4│'c'‿4││
-│└─────┴─────┘│└─────┴─────┘│
-└─────────────┴─────────────┘
+┌─
+· ⟨ ⟨ 'a' 2 ⟩ ⟨ 'a' 3 ⟩ ⟩ ⟨ ⟨ 'b' 4 ⟩ ⟨ 'c' 4 ⟩ ⟩
+ ┘
</pre>
<p>With a positive operand, Depth doesn't have to use the same depth everywhere. Here, Length is applied as soon as the depth for a particular element is 1 or less, including if the argument has depth 0. For example, it maps over <code><span class='Bracket'>⟨</span><span class='Number'>2</span><span class='Separator'>,</span><span class='Bracket'>⟨</span><span class='Number'>3</span><span class='Separator'>,</span><span class='Number'>4</span><span class='Bracket'>⟩⟩</span></code>, but not over <code><span class='Bracket'>⟨</span><span class='Number'>11</span><span class='Separator'>,</span><span class='Number'>12</span><span class='Bracket'>⟩</span></code>, even though these are elements of the same array.</p>
<pre> <span class='Function'>≠</span><span class='Modifier2'>⚇</span><span class='Number'>1</span> <span class='Bracket'>⟨</span><span class='Number'>1</span><span class='Separator'>,</span><span class='Bracket'>⟨</span><span class='Number'>2</span><span class='Separator'>,</span><span class='Bracket'>⟨</span><span class='Number'>3</span><span class='Separator'>,</span><span class='Number'>4</span><span class='Bracket'>⟩⟩</span><span class='Separator'>,</span><span class='Bracket'>⟨</span><span class='Number'>5</span><span class='Separator'>,</span><span class='Bracket'>⟨</span><span class='Number'>6</span><span class='Separator'>,</span><span class='Number'>7</span><span class='Bracket'>⟩</span><span class='Separator'>,</span><span class='Bracket'>⟨</span><span class='Number'>8</span><span class='Separator'>,</span><span class='Number'>9</span><span class='Separator'>,</span><span class='Number'>10</span><span class='Bracket'>⟩⟩</span><span class='Separator'>,</span><span class='Bracket'>⟨</span><span class='Number'>11</span><span class='Separator'>,</span><span class='Number'>12</span><span class='Bracket'>⟩⟩</span>
-┌─┬───┬─────┬─┐
-│1│1‿2│1‿2‿3│2│
-└─┴───┴─────┴─┘
+⟨ 1 ⟨ 1 2 ⟩ ⟨ 1 2 3 ⟩ 2 ⟩
</pre>