diff options
Diffstat (limited to 'docs/doc/compose.html')
| -rw-r--r-- | docs/doc/compose.html | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/docs/doc/compose.html b/docs/doc/compose.html new file mode 100644 index 00000000..4458ea3c --- /dev/null +++ b/docs/doc/compose.html @@ -0,0 +1,140 @@ +<head> + <link href="../favicon.ico" rel="shortcut icon" type="image/x-icon"/> + <link href="../style.css" rel="stylesheet"/> + <title>BQN: Atop and Over</title> +</head> +<div class="nav">(<a href="https://github.com/mlochbaum/BQN">github</a>) / <a href="../index.html">BQN</a> / <a href="index.html">doc</a></div> +<h1 id="atop-and-over"><a class="header" href="#atop-and-over">Atop and Over</a></h1> +<svg viewBox='-51 0 672 270'> + <g font-size='20px' text-anchor='middle' transform='translate(145,20)'> + <rect class='code' stroke-width='1' rx='12' x='-120.4' y='1' width='240.8' height='205'/> + <text dy='0.32em' y='223' fill='currentColor'>Atop</text> + <g font-size='21px' font-family='BQN,monospace' transform='translate(-60.87,25)'> + <text dy='0.32em' y='155' font-size='19px'><tspan class='Function'>π½</tspan><tspan class='Modifier2'>β</tspan><tspan class='Function'>πΎ</tspan> <tspan class='Value'>π©</tspan></text> + <path class='yellow' style='fill:none' stroke-width='2' d='M0 0L0 57'/> + <path class='yellow' style='fill:none' stroke-width='2' d='M0 57L0 114'/> + <circle r='12' class='code' stroke-width='0' cx='0' cy='0'/> + <circle r='12' class='code' stroke-width='0' cx='0' cy='57'/> + <circle r='12' class='code' stroke-width='0' cx='0' cy='114'/> + <text dy='0.32em' x='0' y='0'><tspan class='Function'>π½</tspan></text> + <text dy='0.32em' x='0' y='57'><tspan class='Function'>πΎ</tspan></text> + <text dy='0.32em' x='0' y='114'><tspan class='Value'>π©</tspan></text> + </g> + <g font-size='21px' font-family='BQN,monospace' transform='translate(60.87,25)'> + <text dy='0.32em' y='155' font-size='19px'><tspan class='Value'>π¨</tspan> <tspan class='Function'>π½</tspan><tspan class='Modifier2'>β</tspan><tspan class='Function'>πΎ</tspan> <tspan class='Value'>π©</tspan></text> + <path class='yellow' style='fill:none' stroke-width='2' d='M0 0L0 57'/> + <path class='yellow' style='fill:none' stroke-width='2' d='M0 57L-32 114'/> + <path class='yellow' style='fill:none' stroke-width='2' d='M0 57L32 114'/> + <circle r='12' class='code' stroke-width='0' cx='0' cy='0'/> + <circle r='12' class='code' stroke-width='0' cx='0' cy='57'/> + <circle r='12' class='code' stroke-width='0' cx='-32' cy='114'/> + <circle r='12' class='code' stroke-width='0' cx='32' cy='114'/> + <text dy='0.32em' x='0' y='0'><tspan class='Function'>π½</tspan></text> + <text dy='0.32em' x='0' y='57'><tspan class='Function'>πΎ</tspan></text> + <text dy='0.32em' x='-32' y='114'><tspan class='Value'>π¨</tspan></text> + <text dy='0.32em' x='32' y='114'><tspan class='Value'>π©</tspan></text> + </g> + </g> + <g font-size='20px' text-anchor='middle' transform='translate(425,20)'> + <rect class='code' stroke-width='1' rx='12' x='-120.4' y='1' width='240.8' height='205'/> + <text dy='0.32em' y='223' fill='currentColor'>Over</text> + <g font-size='21px' font-family='BQN,monospace' transform='translate(-60.87,25)'> + <text dy='0.32em' y='155' font-size='19px'><tspan class='Function'>π½</tspan><tspan class='Modifier2'>β</tspan><tspan class='Function'>πΎ</tspan> <tspan class='Value'>π©</tspan></text> + <path class='yellow' style='fill:none' stroke-width='2' d='M0 0L0 57'/> + <path class='yellow' style='fill:none' stroke-width='2' d='M0 57L0 114'/> + <circle r='12' class='code' stroke-width='0' cx='0' cy='0'/> + <circle r='12' class='code' stroke-width='0' cx='0' cy='57'/> + <circle r='12' class='code' stroke-width='0' cx='0' cy='114'/> + <text dy='0.32em' x='0' y='0'><tspan class='Function'>π½</tspan></text> + <text dy='0.32em' x='0' y='57'><tspan class='Function'>πΎ</tspan></text> + <text dy='0.32em' x='0' y='114'><tspan class='Value'>π©</tspan></text> + </g> + <g font-size='21px' font-family='BQN,monospace' transform='translate(60.87,25)'> + <text dy='0.32em' y='155' font-size='19px'><tspan class='Value'>π¨</tspan> <tspan class='Function'>π½</tspan><tspan class='Modifier2'>β</tspan><tspan class='Function'>πΎ</tspan> <tspan class='Value'>π©</tspan></text> + <path class='yellow' style='fill:none' stroke-width='2' d='M0 0L-32 57'/> + <path class='yellow' style='fill:none' stroke-width='2' d='M-32 57L-32 114'/> + <path class='yellow' style='fill:none' stroke-width='2' d='M0 0L32 57'/> + <path class='yellow' style='fill:none' stroke-width='2' d='M32 57L32 114'/> + <circle r='12' class='code' stroke-width='0' cx='0' cy='0'/> + <circle r='12' class='code' stroke-width='0' cx='-32' cy='57'/> + <circle r='12' class='code' stroke-width='0' cx='32' cy='57'/> + <circle r='12' class='code' stroke-width='0' cx='-32' cy='114'/> + <circle r='12' class='code' stroke-width='0' cx='32' cy='114'/> + <text dy='0.32em' x='0' y='0'><tspan class='Function'>π½</tspan></text> + <text dy='0.32em' x='-32' y='57'><tspan class='Function'>πΎ</tspan></text> + <text dy='0.32em' x='32' y='57'><tspan class='Function'>πΎ</tspan></text> + <text dy='0.32em' x='-32' y='114'><tspan class='Value'>π¨</tspan></text> + <text dy='0.32em' x='32' y='114'><tspan class='Value'>π©</tspan></text> + </g> + </g> +</svg> + +<p>Atop and Over are 2-modifiers that extend the idea of "apply this, then that" in two different ways. They're modelled after the mathematical notation fβg to compose two functions, and both do the same thing when there's one argument: <code><span class='Function'>F</span><span class='Modifier2'>β</span><span class='Function'>G</span> <span class='Value'>x</span></code> or <code><span class='Function'>F</span><span class='Modifier2'>β</span><span class='Function'>G</span> <span class='Value'>x</span></code> is <code><span class='Function'>F</span> <span class='Function'>G</span> <span class='Value'>x</span></code>.</p> +<table> +<thead> +<tr> +<th><code><span class='Function'>Cmp</span></code></th> +<th><code><span class='Function'>Cmp</span> <span class='Value'>π©</span></code></th> +<th align="center"><code><span class='Value'>π¨</span> <span class='Function'>Cmp</span> <span class='Value'>π©</span></code></th> +<th align="center">Unified</th> +<th align="center">On list</th> +</tr> +</thead> +<tbody> +<tr> +<td><code><span class='Function'>F</span><span class='Modifier2'>β</span><span class='Function'>G</span></code></td> +<td><code><span class='Function'>F</span> <span class='Function'>G</span> <span class='Value'>π©</span></code></td> +<td align="center"><code><span class='Function'>F</span> <span class='Value'>π¨</span> <span class='Function'>G</span> <span class='Value'>π©</span></code></td> +<td align="center"><code><span class='Brace'>{</span><span class='Function'>π½</span><span class='Value'>π¨</span><span class='Function'>πΎ</span><span class='Value'>π©</span><span class='Brace'>}</span></code></td> +<td align="center"><code><span class='Function'>F</span> <span class='Function'>G</span><span class='Modifier'>Β΄</span><span class='Value'>π©</span></code></td> +</tr> +<tr> +<td><code><span class='Function'>F</span><span class='Modifier2'>β</span><span class='Function'>G</span></code></td> +<td><code><span class='Function'>F</span> <span class='Function'>G</span> <span class='Value'>π©</span></code></td> +<td align="center"><code><span class='Paren'>(</span><span class='Function'>G</span> <span class='Value'>π¨</span><span class='Paren'>)</span> <span class='Function'>F</span> <span class='Function'>G</span> <span class='Value'>π©</span></code></td> +<td align="center"><code><span class='Brace'>{</span><span class='Paren'>(</span><span class='Function'>πΎ</span><span class='Value'>π¨</span><span class='Paren'>)</span><span class='Function'>π½πΎ</span><span class='Value'>π©</span><span class='Brace'>}</span></code></td> +<td align="center"><code><span class='Function'>F</span><span class='Modifier'>Β΄</span><span class='Function'>G</span><span class='Modifier'>Β¨</span><span class='Value'>π©</span></code></td> +</tr> +</tbody> +</table> +<p>When there are two arguments, we might say Atop treats the right operand <code><span class='Function'>πΎ</span></code> as primary and Over treats <code><span class='Function'>π½</span></code> as primaryβthe primary operand becomes dyadic while the other is always monadic. Atop applies <code><span class='Function'>πΎ</span></code> directly, making it more like mathematical composition if we suppose that <code><span class='Function'>πΎ</span></code> is a function that can take a pair of arguments. Over instead makes two calls to apply <code><span class='Function'>πΎ</span></code> separately to both arguments, then passes the results to <code><span class='Function'>π½</span></code>.</p> +<h2 id="atop"><a class="header" href="#atop">Atop</a></h2> +<p>Of the two modifiers on this page, Atop is more common but less impactful. The composition <code><span class='Function'>F</span><span class='Modifier2'>β</span><span class='Function'>G</span></code> is equivalent to the 2-<a href="train.html">train</a> <code><span class='Function'>F</span> <span class='Function'>G</span></code> (the trains page has hints on when you'd choose one or the other). Its definition <code><span class='Brace'>{</span><span class='Function'>F</span><span class='Value'>π¨</span><span class='Function'>G</span><span class='Value'>π©</span><span class='Brace'>}</span></code> means that <code><span class='Function'>G</span></code> is applied to one or two arguments and <code><span class='Function'>F</span></code> is applied monadically to the result. It could be considered a "default way" to compose two functions. Keeps <a href="tacit.html">tacit</a> programming syntax running smoothly, without making noise about it. Not like that busybody <code><span class='Modifier2'>βΈ</span></code>. Some examples:</p> +<p><code><span class='Function'>β</span><span class='Modifier2'>β</span><span class='Function'>β </span></code> is useful with one argument: <code><span class='Function'>ββ </span><span class='Value'>l</span></code> is a list of indices for <code><span class='Value'>l</span></code>.</p> +<p><code><span class='Function'>β</span><span class='Modifier2'>β</span><span class='Function'>Γ·</span></code> is useful with two arguments: <code><span class='Function'>β</span><span class='Value'>a</span><span class='Function'>Γ·</span><span class='Value'>b</span></code> is the integer part when dividing <code><span class='Value'>a</span></code> by <code><span class='Value'>b</span></code>, often paired with the <a href="arithmetic.html#additional-arithmetic">remainder</a> <code><span class='Value'>b</span><span class='Function'>|</span><span class='Value'>a</span></code>.</p> +<p><code><span class='Function'>β</span><span class='Modifier2'>β</span><span class='Function'>β</span></code> is useful with one or two arguments. From right to left, we have <a href="selfcmp.html#classify">Classify</a>/<a href="search.html#index-of">Index-of</a> (<code><span class='Function'>β</span></code>) to convert values to indices, and <a href="group.html">Group Indices</a> to group the indices. Er, that sounds good but what it <em>actually</em> does is to group indices of Group's argument, which correspond to indices of the original <code><span class='Value'>π©</span></code>, according to their values as returned by <code><span class='Function'>β</span></code>. Without a left argument, this means indices of <code><span class='Value'>π©</span></code> are grouped corresponding to <code><span class='Function'>β·</span><span class='Value'>π©</span></code>, and if <code><span class='Value'>π¨</span></code> is provided the groups correspond to <code><span class='Value'>π¨</span></code> instead.</p> +<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=4oqU4oiY4oqQICJiYmVhYmVlIgoKImFiY2RlIiDiipTiiJjiipAgImJiZWFiZWUi">βοΈ</a><pre> <span class='Function'>β</span><span class='Modifier2'>β</span><span class='Function'>β</span> <span class='String'>"bbeabee"</span> +β¨ β¨ 0 1 4 β© β¨ 2 5 6 β© β¨ 3 β© β© + + <span class='String'>"abcde"</span> <span class='Function'>β</span><span class='Modifier2'>β</span><span class='Function'>β</span> <span class='String'>"bbeabee"</span> +β¨ β¨ 3 β© β¨ 0 1 4 β© β¨β© β¨β© β¨ 2 5 6 β© β© +</pre> +<h2 id="over"><a class="header" href="#over">Over</a></h2> +<p>Once you get used to Over, it's painful to go without it. I'd use it all the time in C if I could.</p> +<p>Usually Over is used just for the dyadic meaning. If you have a composition that only works with one argument it's typical to write it with Atop (<code><span class='Modifier2'>β</span></code>). And cases that work with one or two arguments do come up from time to time, but they're fairly rare, so the examples below are just for two arguments.</p> +<p>A classic is the function <code><span class='Function'>β‘</span><span class='Modifier2'>β</span><span class='Function'>β§</span></code>, which tests whether <code><span class='Value'>π¨</span></code> is a reordering of <code><span class='Value'>π©</span></code>. The idea is to sort both arrays with <code><span class='Function'>β§</span></code> to remove the ordering information</p> +<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=IkJRTiIg4omh4peL4oinICJRTkIiCiJCUU4iIOKJoeKXi+KIpyAiQkJRIg==">βοΈ</a><pre> <span class='String'>"BQN"</span> <span class='Function'>β‘</span><span class='Modifier2'>β</span><span class='Function'>β§</span> <span class='String'>"QNB"</span> +1 + <span class='String'>"BQN"</span> <span class='Function'>β‘</span><span class='Modifier2'>β</span><span class='Function'>β§</span> <span class='String'>"BBQ"</span> +0 +</pre> +<p>Another example is <code><span class='Function'>/</span><span class='Modifier2'>β</span><span class='Function'>β₯</span></code>, used to filter elements in a high-rank array. Alone, <code><span class='Function'>/</span></code> won't do this because there's no automatic choice of ordering for the results. Applying <a href="reshape.html">Deshape</a> (<code><span class='Function'>β₯</span></code>) to both chooses index order.</p> +<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=4oqiIGEg4oaQICJxQnJzIuKJjSJRdHVOIgoKYSA8ICdhJyAgIyBDYXBpdGFsIGxldHRlcnMKCihhPCdhJykgLyBhICAjIE5vdCBhbGxvd2VkCgooYTwnYScpIC/il4vipYogYQ==">βοΈ</a><pre> <span class='Function'>β’</span> <span class='Value'>a</span> <span class='Gets'>β</span> <span class='String'>"qBrs"</span><span class='Function'>β</span><span class='String'>"QtuN"</span> +ββ +β΅"qBrs + QtuN" + β + + <span class='Value'>a</span> <span class='Function'><</span> <span class='String'>'a'</span> <span class='Comment'># Capital letters +</span>ββ +β΅ 0 1 0 0 + 1 0 0 1 + β + + <span class='Paren'>(</span><span class='Value'>a</span><span class='Function'><</span><span class='String'>'a'</span><span class='Paren'>)</span> <span class='Function'>/</span> <span class='Value'>a</span> <span class='Comment'># Not allowed +</span><span class='Error'>Error: π¨/π©: Components of π¨ must have rank 0 or 1</span> + + <span class='Paren'>(</span><span class='Value'>a</span><span class='Function'><</span><span class='String'>'a'</span><span class='Paren'>)</span> <span class='Function'>/</span><span class='Modifier2'>β</span><span class='Function'>β₯</span> <span class='Value'>a</span> +"BQN" +</pre> +<p>Over is closely connected with the Under modifier, which performs all the same steps but then undoes <code><span class='Function'>πΎ</span></code> afterwards.</p> |
