diff options
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/doc/based.html | 2 | ||||
| -rw-r--r-- | docs/doc/embed.html | 2 | ||||
| -rw-r--r-- | docs/doc/fromDyalog.html | 4 | ||||
| -rw-r--r-- | docs/doc/fromJ.html | 114 | ||||
| -rw-r--r-- | docs/doc/namespace.html | 6 | ||||
| -rw-r--r-- | docs/doc/oop.html | 20 | ||||
| -rw-r--r-- | docs/running.html | 2 | ||||
| -rw-r--r-- | docs/tutorial/list.html | 2 |
8 files changed, 76 insertions, 76 deletions
diff --git a/docs/doc/based.html b/docs/doc/based.html index ced213c8..36ce2af8 100644 --- a/docs/doc/based.html +++ b/docs/doc/based.html @@ -48,4 +48,4 @@ <h2 id="versus-the-boxed-array-model">Versus the boxed array model</h2> <p>The <a href="https://aplwiki.com/wiki/Array_model#Boxes">boxed array model</a> of SHARP APL, A+, and J is an inductive system like BQN's. But this model uses arrays as the base case: numeric and character arrays are the simplest kind of data allowed, and "a number" means a rank-0 numeric array. The inductive step is the array of boxes; as with numbers "a box" is simply a rank-0 array of boxes.</p> <p>Numeric and character arrays in this system have depth 0. In general these correspond to arrays of depth 1 in BQN, but because there's no lower depth they are also used where BQN atoms would appear. For example, both Shape (<code><span class='Value'>$</span></code>) and Length (<code><span class='Comment'>#</span></code>) return depth-0 results in J. For an array <code><span class='Value'>a</span></code> with rank at least 1, the length <code><span class='Comment'>#a</span></code> is exactly <code><span class='Value'>[</span><span class='Function'>/</span> <span class='Value'>$</span> <span class='Value'>a</span></code>, while the identical BQN code <code><span class='Function'>⊣</span><span class='Modifier'>˝</span> <span class='Function'>≢</span> <span class='Value'>a</span></code> returns not <code><span class='Function'>≠</span> <span class='Value'>a</span></code> but <code><span class='Function'><</span> <span class='Function'>≠</span> <span class='Value'>a</span></code>. Like the nested model, the boxed model can hide depth issues that occur at lower depths but generally reveals them at higher depths.</p> -<p>The boundary at depth 0 will tend to cause inconsistencies and confusion in any array language, and boxed array languages push this boundary up a level. This leads to the programmer spending more effort managing boxes: for example, to reverse each list in a list of lists, the programmer can use reverse under open, <code><span class='Function'>|</span><span class='Number'>.</span> <span class='Value'>&</span><span class='Number'>.</span> <span class='Function'>></span></code>. But to find the lengths of each of these lists, <code><span class='Comment'># &. ></span></code> would yield a boxed list, which is usually not wanted, so <code><span class='Comment'># @ ></span></code> is needed instead. BQN shows that a system that doesn't require these distinctions is possible, as a BQN programmer would use <code><span class='Function'>⌽</span><span class='Modifier'>¨</span></code> and <code><span class='Function'>≠</span><span class='Modifier'>¨</span></code>.</p> +<p>The boundary at depth 0 will tend to cause inconsistencies and confusion in any array language, and boxed array languages push this boundary up a level. This leads to the programmer spending more effort managing boxes: for example, to reverse each list in a list of lists, the programmer can use reverse under open, <code><span class='Function'>|</span><span class='Value'>.</span> <span class='Value'>&.</span> <span class='Function'>></span></code>. But to find the lengths of each of these lists, <code><span class='Comment'># &. ></span></code> would yield a boxed list, which is usually not wanted, so <code><span class='Comment'># @ ></span></code> is needed instead. BQN shows that a system that doesn't require these distinctions is possible, as a BQN programmer would use <code><span class='Function'>⌽</span><span class='Modifier'>¨</span></code> and <code><span class='Function'>≠</span><span class='Modifier'>¨</span></code>.</p> diff --git a/docs/doc/embed.html b/docs/doc/embed.html index 2a2ca1c7..bd3bb94c 100644 --- a/docs/doc/embed.html +++ b/docs/doc/embed.html @@ -36,7 +36,7 @@ <p>In the programs above we've used numbers and functions of one argument, which mean the same thing in BQN and JS. This isn't the case for all types: although every BQN value is stored as some JS value, the way it's represented may not be obvious and there are many JS values that don't represent any BQN value and could cause errors. BQN operations don't verify that their inputs are valid BQN values (this would have a large performance cost), so it's up to the JS programmer to make sure that values passed in are valid. To do this, you need to know the encodings for each of the six BQN <a href="types.html">types</a>.</p> <p>The two atomic data values are simple: numbers are just JS numbers, and characters are strings containing a single code point. Arrays <em>are</em> JS arrays, but with some extra information. Since JS arrays are 1-dimensional, a BQN array <code><span class='Value'>a</span></code> is stored as the element list <code><span class='Function'>⥊</span><span class='Value'>a</span></code>. Its shape <code><span class='Function'>≢</span><span class='Value'>a</span></code>, a list of numbers, is <code><span class='Value'>a.sh</span></code> in JS (the shape isn't necessarily a BQN array so it doesn't have to have a <code><span class='Value'>sh</span></code> property). Optionally, its fill element is <code><span class='Value'>a.fill</span></code>. Note that a BQN string is not a JS string, but instead an array of BQN characters, or JS strings. To convert it to a JS string you can use <code><span class='Value'>str.join</span><span class='Paren'>(</span><span class='String'>""</span><span class='Paren'>)</span></code>.</p> <p>There are two utilities for converting from JS to BQN data: <code><span class='Value'>list</span><span class='Paren'>(</span><span class='Value'>[…]</span><span class='Paren'>)</span></code> converts a JS array to a BQN list, and <code><span class='Value'>str</span><span class='Paren'>(</span><span class='String'>"JS string"</span><span class='Paren'>)</span></code> converts a string.</p> -<p>Operations are all stored as JS functions, with one or two arguments for the inputs. The type is determined by the <code><span class='Number'>.m</span></code> property, which is <code><span class='Number'>1</span></code> for a 1-modifier and <code><span class='Number'>2</span></code> for a 2-modifier, and undefined or falsy for a function. Functions might be called with one or two arguments. In either case, <code><span class='Value'>𝕩</span></code> is the first argument; <code><span class='Value'>𝕨</span></code>, if present, is the second. Note that <code><span class='Function'>F</span><span class='Paren'>(</span><span class='Value'>x</span><span class='Separator'>,</span><span class='Value'>w</span><span class='Paren'>)</span></code> in JS corresponds to <code><span class='Value'>w</span> <span class='Function'>F</span> <span class='Value'>x</span></code> in BQN, reversing the visual ordering of the arguments! For modifiers there's no such reversal, as <code><span class='Value'>𝕗</span></code> is always the first argument, and for 2-modifiers <code><span class='Value'>𝕘</span></code> is the second argument. As in BQN, a modifier may or may not return a function.</p> +<p>Operations are all stored as JS functions, with one or two arguments for the inputs. The type is determined by the <code><span class='Value'>.m</span></code> property, which is <code><span class='Number'>1</span></code> for a 1-modifier and <code><span class='Number'>2</span></code> for a 2-modifier, and undefined or falsy for a function. Functions might be called with one or two arguments. In either case, <code><span class='Value'>𝕩</span></code> is the first argument; <code><span class='Value'>𝕨</span></code>, if present, is the second. Note that <code><span class='Function'>F</span><span class='Paren'>(</span><span class='Value'>x</span><span class='Separator'>,</span><span class='Value'>w</span><span class='Paren'>)</span></code> in JS corresponds to <code><span class='Value'>w</span> <span class='Function'>F</span> <span class='Value'>x</span></code> in BQN, reversing the visual ordering of the arguments! For modifiers there's no such reversal, as <code><span class='Value'>𝕗</span></code> is always the first argument, and for 2-modifiers <code><span class='Value'>𝕘</span></code> is the second argument. As in BQN, a modifier may or may not return a function.</p> <p>Operations may have some extra properties set that aren't terribly important for the JS programmer: for each primitive <code><span class='Value'>p</span></code>, <code><span class='Value'>p.glyph</span></code> gives its glyph, and for a compound operation <code><span class='Value'>o</span></code> such as a train, or a modifier with bound operands, <code><span class='Value'>o.repr</span><span class='Paren'>()</span></code> decomposes it into its parts. It wouldn't make sense to define either of these properties for a function created in JS.</p> <h2 id="other-functionality">Other functionality</h2> <p>The BQN script also contains the function <code><span class='Value'>fmt</span></code>, which takes a BQN value for its argument and returns a string displaying it.</p> diff --git a/docs/doc/fromDyalog.html b/docs/doc/fromDyalog.html index 5a4f6241..9a64afaa 100644 --- a/docs/doc/fromDyalog.html +++ b/docs/doc/fromDyalog.html @@ -260,7 +260,7 @@ <tr> <td align="center">Dyalog</td> <td align="center"><code><span class='Modifier'>¨</span></code></td> -<td align="center"><code><span class='Modifier2'>∘</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Modifier2'>∘</span><span class='Value'>.</span></code></td> <td align="center"><code><span class='Value'>⌿</span></code></td> <td align="center"><code><span class='Value'>⍤</span></code></td> <td align="center"><code><span class='Value'>⍣</span></code></td> @@ -319,7 +319,7 @@ <tr><td> <code><span class='Value'>⍨</span></code> </td><td colspan=2> <code><span class='Modifier'>˜</span></code> </td></tr> <tr><td> <code><span class='Value'>⍣</span></code> </td><td colspan=2> <code><span class='Modifier2'>⍟</span></code> </td></tr> <tr><td> <code><span class='Value'>f.g</span></code> </td><td> </td><td> <code><span class='Value'>f</span><span class='Modifier'>˝</span><span class='Modifier2'>∘</span><span class='Value'>g</span><span class='Modifier2'>⎉</span><span class='Number'>1</span><span class='Ligature'>‿</span><span class='Number'>∞</span></code> </td></tr> -<tr><td> <code><span class='Modifier2'>∘</span><span class='Number'>.f</span></code> </td><td> </td><td> <code><span class='Value'>f</span><span class='Modifier'>⌜</span></code> </td></tr> +<tr><td> <code><span class='Modifier2'>∘</span><span class='Value'>.f</span></code> </td><td> </td><td> <code><span class='Value'>f</span><span class='Modifier'>⌜</span></code> </td></tr> <tr><td> <code><span class='Function'>A</span><span class='Modifier2'>∘</span><span class='Value'>g</span></code> </td><td> <code><span class='Function'>A</span><span class='Modifier2'>⊸</span><span class='Value'>g</span></code> </td><td> </td></tr> <tr><td> <code><span class='Value'>f</span><span class='Modifier2'>∘</span><span class='Function'>B</span></code> </td><td> <code><span class='Value'>f</span><span class='Modifier2'>⟜</span><span class='Function'>B</span></code> </td><td> </td></tr> <tr><td> <code><span class='Value'>f</span><span class='Modifier2'>∘</span><span class='Value'>g</span></code> </td><td colspan=2> <code><span class='Value'>f</span><span class='Modifier2'>⟜</span><span class='Value'>g</span></code> </td></tr> diff --git a/docs/doc/fromJ.html b/docs/doc/fromJ.html index a39e156c..3c5ad0a2 100644 --- a/docs/doc/fromJ.html +++ b/docs/doc/fromJ.html @@ -51,7 +51,7 @@ </thead> <tbody> <tr> -<td><code><span class='Function'>NB.</span></code></td> +<td><code><span class='Function'>NB</span><span class='Value'>.</span></code></td> <td><code><span class='Comment'>#</span></code></td> <td></td> </tr> @@ -61,7 +61,7 @@ <td><code><span class='String'>'</span></code> creates characters</td> </tr> <tr> -<td><code><span class='Function'>=</span><span class='Number'>.</span></code> and <code><span class='Function'>=</span><span class='Value'>:</span></code></td> +<td><code><span class='Function'>=</span><span class='Value'>.</span></code> and <code><span class='Function'>=</span><span class='Value'>:</span></code></td> <td><code><span class='Gets'>←</span></code> and <code><span class='Gets'>↩</span></code></td> <td><code><span class='Gets'>←</span></code> to define; <code><span class='Gets'>↩</span></code> to modify</td> </tr> @@ -136,13 +136,13 @@ <td align="center"><code><span class='Value'>%</span></code></td> <td align="center"><code><span class='Value'>^</span></code></td> <td align="center"><code><span class='Value'>%:</span></code></td> -<td align="center"><code><span class='Function'><</span><span class='Number'>.</span></code></td> -<td align="center"><code><span class='Function'>></span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Function'><</span><span class='Value'>.</span></code></td> +<td align="center"><code><span class='Function'>></span><span class='Value'>.</span></code></td> <td align="center"><code><span class='Function'><</span><span class='Value'>:</span></code></td> <td align="center"><code><span class='Function'>></span><span class='Value'>:</span></code></td> <td align="center"><code><span class='Value'>[</span></code></td> <td align="center"><code><span class='Value'>]</span></code></td> -<td align="center"><code><span class='Function'>|</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Function'>|</span><span class='Value'>.</span></code></td> <td align="center"><code><span class='Function'>|</span><span class='Value'>:</span></code></td> </tr> </tbody> @@ -168,10 +168,10 @@ <td align="center">Monad</td> <td align="center"><code><span class='Function'>/</span><span class='Value'>:~</span></code></td> <td align="center"><code><span class='Value'>\:~</span></code></td> -<td align="center"><code><span class='Function'>-</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Function'>-</span><span class='Value'>.</span></code></td> <td align="center"><code><span class='Comment'>#@$</span></code></td> <td align="center"><code><span class='Comment'>#</span></code></td> -<td align="center"><code><span class='Function'>L.</span></code></td> +<td align="center"><code><span class='Function'>L</span><span class='Value'>.</span></code></td> <td align="center"><code><span class='Value'>$</span></code></td> <td align="center"><code><span class='Separator'>,</span></code></td> <td align="center"><code><span class='Value'>;</span></code></td> @@ -179,13 +179,13 @@ </tr> <tr> <td align="center">Dyad</td> -<td align="center"><code><span class='Value'>*</span><span class='Number'>.</span></code></td> -<td align="center"><code><span class='Function'>+</span><span class='Number'>.</span></code></td> -<td align="center"><code><span class='Function'>+-</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Value'>*.</span></code></td> +<td align="center"><code><span class='Function'>+</span><span class='Value'>.</span></code></td> +<td align="center"><code><span class='Function'>+-</span><span class='Value'>.</span></code></td> <td align="center"><code><span class='Function'>=</span></code></td> <td align="center"><code><span class='Value'>~:</span></code></td> <td align="center"><code><span class='Function'>-</span><span class='Value'>:</span></code></td> -<td align="center"><code><span class='Function'>-</span><span class='Number'>.</span><span class='String'>@</span><span class='Function'>-</span><span class='Value'>:</span></code></td> +<td align="center"><code><span class='Function'>-</span><span class='Value'>.</span><span class='String'>@</span><span class='Function'>-</span><span class='Value'>:</span></code></td> <td align="center"><code><span class='Value'>$</span></code></td> <td align="center"><code><span class='Separator'>,</span></code></td> <td align="center"><code><span class='Separator'>,</span><span class='Value'>:</span></code></td> @@ -208,16 +208,16 @@ <tr> <td align="center">Monad</td> <td align="center"><code><span class='Function'><</span><span class='Value'>\</span></code></td> -<td align="center"><code><span class='Function'><</span><span class='Value'>\</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Function'><</span><span class='Value'>\.</span></code></td> <td align="center"><code><span class='Value'>i.</span></code></td> <td align="center"><code><span class='Comment'>#{.(_1-#){.]</span></code></td> <td align="center"><code><span class='Function'>-</span><span class='String'>@</span><span class='Comment'>#{.(1+#){.]</span></code></td> -<td align="center"><code><span class='Function'>I.</span></code></td> +<td align="center"><code><span class='Function'>I</span><span class='Value'>.</span></code></td> </tr> <tr> <td align="center">Dyad</td> -<td align="center"><code><span class='Brace'>{</span><span class='Number'>.</span></code></td> -<td align="center"><code><span class='Brace'>}</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Brace'>{</span><span class='Value'>.</span></code></td> +<td align="center"><code><span class='Brace'>}</span><span class='Value'>.</span></code></td> <td align="center"><code><span class='Value'>]\</span></code></td> <td align="center"><code><span class='Comment'>#@]{.,</span></code></td> <td align="center"><code><span class='Function'>-</span><span class='String'>@</span><span class='Comment'>#@]{.,~</span></code></td> @@ -245,29 +245,29 @@ <td align="center">Monad</td> <td align="center"><code><span class='Function'>/</span><span class='Value'>:</span></code></td> <td align="center"><code><span class='Function'>/</span><span class='Value'>:</span></code></td> -<td align="center"><code><span class='Brace'>{</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Brace'>{</span><span class='Value'>.</span></code></td> <td align="center"><code><span class='Number'>0</span><span class='Brace'>{</span><span class='Value'>::</span><span class='Separator'>,</span></code></td> -<td align="center"><code><span class='Value'>i.~~</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Value'>i.~~.</span></code></td> <td align="center"><code><span class='Value'>…</span></code></td> <td align="center"><code><span class='Value'>~:</span></code></td> -<td align="center"><code><span class='Value'>~</span><span class='Number'>.</span></code></td> -<td align="center"><code><span class='Function'></</span><span class='Number'>.i.</span><span class='String'>@</span><span class='Comment'>#</span></code></td> +<td align="center"><code><span class='Value'>~.</span></code></td> +<td align="center"><code><span class='Function'></</span><span class='Value'>.i.</span><span class='String'>@</span><span class='Comment'>#</span></code></td> </tr> <tr> <td align="center">Dyad</td> -<td align="center"><code><span class='Function'>I.</span></code></td> -<td align="center"><code><span class='Function'>I.</span><span class='Value'>&:</span><span class='Function'>-</span></code></td> +<td align="center"><code><span class='Function'>I</span><span class='Value'>.</span></code></td> +<td align="center"><code><span class='Function'>I</span><span class='Value'>.&:</span><span class='Function'>-</span></code></td> <td align="center"><code><span class='Brace'>{</span></code></td> <td align="center"><code><span class='Brace'>{</span><span class='Value'>::</span></code></td> <td align="center"><code><span class='Value'>i.</span></code></td> <td align="center"><code><span class='Value'>…</span></code></td> <td align="center"><code><span class='Value'>e.</span></code></td> -<td align="center"><code><span class='Function'>E.</span></code></td> -<td align="center"><code><span class='Function'></</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='Function'>E</span><span class='Value'>.</span></code></td> +<td align="center"><code><span class='Function'></</span><span class='Value'>.</span></code></td> </tr> </tbody> </table> -<p>Most of BQN's combinators have J equivalents. The J equivalent <code><span class='String'>"</span><span class='Modifier2'>_</span></code> for <code><span class='Modifier'>˙</span></code> assumes a noun operand, but <code><span class='Modifier'>˙</span></code> makes a constant function for any operand. <code><span class='Modifier2'>◶</span></code> has arguments reversed relative to <code><span class='String'>@</span><span class='Number'>.</span></code>, and uses an actual array of functions rather than gerunds. Besides these, BQN's <code><span class='Modifier2'>⟜</span></code> is like a J hook, that is, <code><span class='Function'>F</span><span class='Modifier2'>⟜</span><span class='Function'>G</span></code> is <code><span class='Paren'>(</span><span class='Function'>F</span> <span class='Function'>G</span><span class='Paren'>)</span></code>, and <code><span class='Modifier2'>⊸</span></code> applies in the opposite direction.</p> +<p>Most of BQN's combinators have J equivalents. The J equivalent <code><span class='String'>"</span><span class='Modifier2'>_</span></code> for <code><span class='Modifier'>˙</span></code> assumes a noun operand, but <code><span class='Modifier'>˙</span></code> makes a constant function for any operand. <code><span class='Modifier2'>◶</span></code> has arguments reversed relative to <code><span class='String'>@</span><span class='Value'>.</span></code>, and uses an actual array of functions rather than gerunds. Besides these, BQN's <code><span class='Modifier2'>⟜</span></code> is like a J hook, that is, <code><span class='Function'>F</span><span class='Modifier2'>⟜</span><span class='Function'>G</span></code> is <code><span class='Paren'>(</span><span class='Function'>F</span> <span class='Function'>G</span><span class='Paren'>)</span></code>, and <code><span class='Modifier2'>⊸</span></code> applies in the opposite direction.</p> <table> <thead> <tr> @@ -289,9 +289,9 @@ <td align="center"><code><span class='Value'>~</span></code></td> <td align="center"><code><span class='String'>@</span><span class='Value'>:</span></code></td> <td align="center"><code><span class='Value'>&:</span></code></td> -<td align="center"><code><span class='Value'>&</span><span class='Number'>.</span><span class='Value'>:</span></code></td> +<td align="center"><code><span class='Value'>&.:</span></code></td> <td align="center"><code><span class='Value'>:</span></code></td> -<td align="center"><code><span class='String'>@</span><span class='Number'>.</span></code></td> +<td align="center"><code><span class='String'>@</span><span class='Value'>.</span></code></td> <td align="center"><code><span class='Value'>::</span></code></td> </tr> </tbody> @@ -316,9 +316,9 @@ <tbody> <tr> <td align="center">J</td> -<td align="center"><code><span class='Value'>&</span><span class='Number'>.</span><span class='Function'>></span></code></td> -<td align="center"><code><span class='Value'>&</span><span class='Number'>.</span><span class='Function'>>/</span></code></td> -<td align="center"><code><span class='Value'>&</span><span class='Number'>.</span><span class='Function'>>/</span></code></td> +<td align="center"><code><span class='Value'>&.</span><span class='Function'>></span></code></td> +<td align="center"><code><span class='Value'>&.</span><span class='Function'>>/</span></code></td> +<td align="center"><code><span class='Value'>&.</span><span class='Function'>>/</span></code></td> <td align="center"><code><span class='Function'>/</span></code></td> <td align="center"><code><span class='Function'>/</span><span class='Value'>\</span></code></td> <td align="center"><code><span class='String'>"</span><span class='Modifier'>_1</span></code></td> @@ -358,13 +358,13 @@ <th align="center"><code><span class='Value'>*</span></code></th> <th align="center"><code><span class='Value'>%</span></code></th> <th align="center"><code><span class='Value'>^</span></code></th> -<th align="center"><code><span class='Value'>^</span><span class='Number'>.</span></code></th> +<th align="center"><code><span class='Value'>^.</span></code></th> <th align="center"><code><span class='Value'>%:</span></code></th> -<th align="center"><code><span class='Function'><</span><span class='Number'>.</span></code></th> -<th align="center"><code><span class='Function'>></span><span class='Number'>.</span></code></th> +<th align="center"><code><span class='Function'><</span><span class='Value'>.</span></code></th> +<th align="center"><code><span class='Function'>></span><span class='Value'>.</span></code></th> <th align="center"><code><span class='Value'>[</span></code></th> <th align="center"><code><span class='Value'>]</span></code></th> -<th align="center"><code><span class='Function'>|</span><span class='Number'>.</span></code></th> +<th align="center"><code><span class='Function'>|</span><span class='Value'>.</span></code></th> <th align="center"><code><span class='Function'>|</span><span class='Value'>:</span></code></th> </tr> </thead> @@ -392,7 +392,7 @@ <th align="center"><code><span class='Value'>~</span></code></th> <th align="center"><code><span class='String'>@</span><span class='Value'>:</span></code></th> <th align="center"><code><span class='Value'>&:</span></code></th> -<th align="center"><code><span class='Value'>&</span><span class='Number'>.</span><span class='Value'>:</span></code></th> +<th align="center"><code><span class='Value'>&.:</span></code></th> <th align="center"><code><span class='Value'>:</span></code></th> <th align="center"><code><span class='String'>"</span></code></th> <th align="center"><code><span class='Function'>L</span><span class='Value'>:</span></code></th> @@ -439,7 +439,7 @@ <td><code><span class='Function'>≥</span></code></td> </tr> <tr> -<td><code><span class='Function'>+</span><span class='Number'>.</span></code></td> +<td><code><span class='Function'>+</span><span class='Value'>.</span></code></td> <td></td> <td><code><span class='Function'>∨</span></code></td> </tr> @@ -449,7 +449,7 @@ <td><code><span class='Function'>¬∨</span></code></td> </tr> <tr> -<td><code><span class='Value'>*</span><span class='Number'>.</span></code></td> +<td><code><span class='Value'>*.</span></code></td> <td></td> <td><code><span class='Function'>∧</span></code></td> </tr> @@ -459,7 +459,7 @@ <td><code><span class='Function'>¬∧</span></code></td> </tr> <tr> -<td><code><span class='Function'>-</span><span class='Number'>.</span></code></td> +<td><code><span class='Function'>-</span><span class='Value'>.</span></code></td> <td><code><span class='Function'>¬</span></code></td> <td><code><span class='Function'>¬</span><span class='Modifier2'>∘</span><span class='Function'>∊/⊣</span></code></td> </tr> @@ -469,7 +469,7 @@ <td><code><span class='Function'>≡</span></code></td> </tr> <tr> -<td><code><span class='Value'>%</span><span class='Number'>.</span></code></td> +<td><code><span class='Value'>%.</span></code></td> <td></td> <td><code><span class='Function'>+</span><span class='Modifier'>˝</span><span class='Modifier2'>∘</span><span class='Function'>×</span><span class='Modifier2'>⎉</span><span class='Number'>1</span><span class='Ligature'>‿</span><span class='Number'>∞</span><span class='Modifier'>⁼</span></code></td> </tr> @@ -479,7 +479,7 @@ <td><code><span class='Function'>⥊</span></code></td> </tr> <tr> -<td><code><span class='Value'>~</span><span class='Number'>.</span></code></td> +<td><code><span class='Value'>~.</span></code></td> <td><code><span class='Function'>⍷</span></code></td> <td></td> </tr> @@ -494,7 +494,7 @@ <td><code><span class='Function'>∾</span></code></td> </tr> <tr> -<td><code><span class='Separator'>,</span><span class='Number'>.</span></code></td> +<td><code><span class='Separator'>,</span><span class='Value'>.</span></code></td> <td><code><span class='Function'>⥊</span><span class='Modifier'>˘</span></code></td> <td><code><span class='Function'>∾</span><span class='Modifier'>˘</span></code></td> </tr> @@ -544,7 +544,7 @@ <td><code><span class='Function'>⊏</span></code></td> </tr> <tr> -<td><code><span class='Brace'>{</span><span class='Number'>.</span></code></td> +<td><code><span class='Brace'>{</span><span class='Value'>.</span></code></td> <td><code><span class='Function'>⊏</span></code></td> <td><code><span class='Function'>↑</span></code></td> </tr> @@ -559,7 +559,7 @@ <td><code><span class='Function'>⊑</span></code></td> </tr> <tr> -<td><code><span class='Brace'>}</span><span class='Number'>.</span></code></td> +<td><code><span class='Brace'>}</span><span class='Value'>.</span></code></td> <td><code><span class='Number'>1</span><span class='Modifier2'>⊸</span><span class='Function'>↓</span></code></td> <td><code><span class='Function'>↓</span></code></td> </tr> @@ -569,7 +569,7 @@ <td></td> </tr> <tr> -<td><code><span class='String'>"</span><span class='Number'>.</span></code></td> +<td><code><span class='String'>"</span><span class='Value'>.</span></code></td> <td><code><span class='Function'>•Eval</span></code></td> <td></td> </tr> @@ -584,7 +584,7 @@ <td><code><span class='Function'>∊</span></code></td> </tr> <tr> -<td><code><span class='Function'>E.</span></code></td> +<td><code><span class='Function'>E</span><span class='Value'>.</span></code></td> <td></td> <td><code><span class='Function'>⍷</span></code></td> </tr> @@ -599,12 +599,12 @@ <td><code><span class='Function'>≠</span><span class='Modifier2'>∘</span><span class='Function'>⊣-</span><span class='Number'>1</span><span class='Function'>+⌽</span><span class='Modifier2'>⊸</span><span class='Function'>⊐</span></code></td> </tr> <tr> -<td><code><span class='Function'>I.</span></code></td> +<td><code><span class='Function'>I</span><span class='Value'>.</span></code></td> <td><code><span class='Function'>/</span></code></td> <td><code><span class='Function'>⍋</span></code></td> </tr> <tr> -<td><code><span class='Function'>L.</span></code></td> +<td><code><span class='Function'>L</span><span class='Value'>.</span></code></td> <td><code><span class='Function'>≡</span></code></td> <td></td> </tr> @@ -615,7 +615,7 @@ </tr> </tbody> </table> -<p>Some J modifier expressions are translated below. BQN doesn't keep track of the rank of functions, so the "close" compositions <code><span class='String'>@</span></code> <code><span class='Value'>&</span></code> <code><span class='Value'>&</span><span class='Number'>.</span></code> have no BQN equivalents: instead, specify a rank after composing.</p> +<p>Some J modifier expressions are translated below. BQN doesn't keep track of the rank of functions, so the "close" compositions <code><span class='String'>@</span></code> <code><span class='Value'>&</span></code> <code><span class='Value'>&.</span></code> have no BQN equivalents: instead, specify a rank after composing.</p> <table> <thead> <tr> @@ -625,7 +625,7 @@ </thead> <tbody> <tr> -<td><code><span class='Value'>&</span><span class='Number'>.</span><span class='Function'>></span></code></td> +<td><code><span class='Value'>&.</span><span class='Function'>></span></code></td> <td><code><span class='Modifier'>¨</span></code></td> </tr> <tr> @@ -633,7 +633,7 @@ <td><code><span class='Function'>F</span><span class='Modifier'>˝</span> <span class='Value'>y</span></code></td> </tr> <tr> -<td><code><span class='Value'>x</span> <span class='Function'>F</span><span class='Value'>&</span><span class='Number'>.</span><span class='Function'>>/</span> <span class='Value'>y</span></code></td> +<td><code><span class='Value'>x</span> <span class='Function'>F</span><span class='Value'>&.</span><span class='Function'>>/</span> <span class='Value'>y</span></code></td> <td><code><span class='Value'>x</span> <span class='Function'>F</span><span class='Modifier'>⌜</span> <span class='Value'>y</span></code></td> </tr> <tr> @@ -641,7 +641,7 @@ <td><code><span class='Value'>x</span> <span class='Function'>F</span><span class='Modifier2'>⎉</span><span class='Value'>r</span><span class='Ligature'>‿</span><span class='Number'>∞</span> <span class='Value'>y</span></code> where <code><span class='Value'>r</span></code> is <code><span class='Function'>F</span></code>'s left rank</td> </tr> <tr> -<td><code><span class='Function'>F</span><span class='Modifier'>`</span><span class='Function'>G</span><span class='Modifier'>`</span><span class='Function'>H</span><span class='String'>@</span><span class='Number'>.C</span></code></td> +<td><code><span class='Function'>F</span><span class='Modifier'>`</span><span class='Function'>G</span><span class='Modifier'>`</span><span class='Function'>H</span><span class='String'>@</span><span class='Value'>.</span><span class='Function'>C</span></code></td> <td><code><span class='Function'>C</span><span class='Modifier2'>◶</span><span class='Bracket'>⟨</span><span class='Function'>F</span><span class='Separator'>,</span><span class='Function'>G</span><span class='Separator'>,</span><span class='Function'>H</span><span class='Bracket'>⟩</span></code></td> </tr> <tr> @@ -649,23 +649,23 @@ <td><code><span class='Value'>x</span><span class='Modifier2'>⌾</span><span class='Paren'>(</span><span class='Value'>y</span><span class='Modifier2'>⊸</span><span class='Function'>⊏</span><span class='Paren'>)</span> <span class='Value'>z</span></code></td> </tr> <tr> -<td><code><span class='Value'>x</span> <span class='Function'>F/</span> <span class='Number'>.</span> <span class='Function'>G</span> <span class='Value'>y</span></code></td> +<td><code><span class='Value'>x</span> <span class='Function'>F/</span> <span class='Value'>.</span> <span class='Function'>G</span> <span class='Value'>y</span></code></td> <td><code><span class='Value'>x</span> <span class='Function'>F</span><span class='Modifier'>˝</span><span class='Modifier2'>∘</span><span class='Function'>G</span><span class='Modifier2'>⎉</span><span class='Number'>1</span><span class='Ligature'>‿</span><span class='Number'>∞</span> <span class='Value'>y</span></code></td> </tr> <tr> -<td><code><span class='Function'>F</span> <span class='Value'>:</span><span class='Number'>.</span> <span class='Function'>G</span></code></td> +<td><code><span class='Function'>F</span> <span class='Value'>:.</span> <span class='Function'>G</span></code></td> <td><code><span class='Brace'>{</span><span class='Function'>𝕊</span><span class='Value'>:</span> <span class='Value'>𝕨</span><span class='Function'>F</span><span class='Value'>𝕩;</span> <span class='Function'>𝕊</span><span class='Modifier'>⁼</span><span class='Value'>:</span> <span class='Value'>𝕨</span><span class='Function'>G</span><span class='Value'>𝕩</span><span class='Brace'>}</span></code></td> </tr> <tr> -<td><code><span class='Function'><</span><span class='Value'>;</span><span class='Number'>._1</span></code></td> +<td><code><span class='Function'><</span><span class='Value'>;.</span><span class='Modifier'>_1</span></code></td> <td><code><span class='Paren'>((</span><span class='Number'>1</span><span class='Function'>-</span><span class='Modifier'>˜</span><span class='Function'>¬×+</span><span class='Modifier'>`</span><span class='Paren'>)</span><span class='Function'>=</span><span class='Modifier2'>⟜</span><span class='Function'>⊏</span><span class='Modifier2'>⊘</span><span class='Function'>⊣</span><span class='Paren'>)</span><span class='Function'>⊔⊢</span></code></td> </tr> <tr> -<td><code><span class='Value'>x</span> <span class='Brace'>{</span><span class='Number'>.</span><span class='Function'>!</span><span class='Number'>.f</span> <span class='Value'>y</span></code></td> +<td><code><span class='Value'>x</span> <span class='Brace'>{</span><span class='Value'>.</span><span class='Function'>!</span><span class='Value'>.f</span> <span class='Value'>y</span></code></td> <td><code><span class='Value'>y</span> <span class='Function'>»</span> <span class='Value'>x</span><span class='Function'>⥊</span><span class='Value'>f</span></code></td> </tr> <tr> -<td><code><span class='Value'>x</span> <span class='Function'>|</span><span class='Number'>.</span><span class='Function'>!</span><span class='Number'>.f</span> <span class='Value'>y</span></code></td> +<td><code><span class='Value'>x</span> <span class='Function'>|</span><span class='Value'>.</span><span class='Function'>!</span><span class='Value'>.f</span> <span class='Value'>y</span></code></td> <td><code><span class='Value'>x</span> <span class='Function'>⥊</span><span class='Modifier2'>⟜</span><span class='Value'>f</span><span class='Modifier2'>⊸</span><span class='Function'>«</span> <span class='Value'>y</span></code>, or <code><span class='Paren'>(</span><span class='Function'>-</span><span class='Value'>x</span><span class='Paren'>)</span> <span class='Function'>⥊</span><span class='Modifier2'>⟜</span><span class='Value'>f</span><span class='Modifier2'>⊸</span><span class='Function'>»</span> <span class='Value'>y</span></code> if <code><span class='Value'>𝕩</span><span class='Function'><</span><span class='Number'>0</span></code></td> </tr> </tbody> @@ -681,7 +681,7 @@ </thead> <tbody> <tr> -<td><code><span class='Function'>/</span><span class='Number'>.</span></code></td> +<td><code><span class='Function'>/</span><span class='Value'>.</span></code></td> <td><code><span class='Paren'>(</span><span class='Function'>+</span><span class='Modifier'>⌜´</span><span class='Function'>↕</span><span class='Modifier'>¨</span><span class='Modifier2'>∘</span><span class='Function'>≢</span><span class='Paren'>)</span><span class='Modifier2'>⊸</span><span class='Function'>⊔</span></code></td> <td><code><span class='Function'>⊐</span><span class='Modifier2'>⊸</span><span class='Function'>⊔</span></code></td> </tr> @@ -691,7 +691,7 @@ <td><code><span class='Function'><</span><span class='Modifier'>˘</span><span class='Function'>↕</span></code></td> </tr> <tr> -<td><code><span class='Value'>\</span><span class='Number'>.</span></code></td> +<td><code><span class='Value'>\.</span></code></td> <td><code><span class='Number'>¯1</span><span class='Function'>↓↓</span></code></td> <td></td> </tr> diff --git a/docs/doc/namespace.html b/docs/doc/namespace.html index 17ed7cf6..c6f19582 100644 --- a/docs/doc/namespace.html +++ b/docs/doc/namespace.html @@ -10,7 +10,7 @@ <p>The following quick example shows a few ways to use a namespace returned by <code><span class='Function'>•Import</span></code>:</p> <pre><span class='Value'>ns</span> <span class='Gets'>←</span> <span class='Function'>•Import</span> <span class='String'>"file.bqn"</span> <span class='Bracket'>⟨</span><span class='Value'>something</span><span class='Separator'>,</span> <span class='Value'>abbr</span><span class='Gets'>⇐</span><span class='Value'>abbreviation</span><span class='Bracket'>⟩</span> <span class='Gets'>←</span> <span class='Value'>ns</span> <span class='Comment'># Destructure -</span><span class='Value'>ns.DoThing</span> <span class='Number'>6</span> <span class='Comment'># Dot syntax +</span><span class='Value'>ns.</span><span class='Function'>DoThing</span> <span class='Number'>6</span> <span class='Comment'># Dot syntax </span></pre> <p>An here's how the contents of file.bqn might look in order to define the variables used above:</p> <pre><span class='Bracket'>⟨</span><span class='Value'>something</span><span class='Separator'>,</span> <span class='Function'>DoThing</span><span class='Bracket'>⟩</span><span class='Gets'>⇐</span> <span class='Comment'># Declare exports @@ -42,9 +42,9 @@ <p>The arrows <code><span class='Gets'>⇐</span></code> used for importing don't indicate that the surrounding block is a namespace or export variables. However, a single statement can both import and export, if it's a destructuring assignment and the main assignment arrow is <code><span class='Gets'>⇐</span></code>.</p> <pre><span class='Bracket'>⟨</span><span class='Value'>two</span><span class='Separator'>,</span> <span class='Value'>vars</span><span class='Bracket'>⟩</span> <span class='Gets'>⇐</span> <span class='Function'>•Import</span> <span class='String'>"stuff.bqn"</span> </pre> -<p>The second way to get a value (just one at a time) from a namespace is dot syntax: write the namespace, then a dot <code><span class='Number'>.</span></code>, then another name.</p> +<p>The second way to get a value (just one at a time) from a namespace is dot syntax: write the namespace, then a dot <code><span class='Value'>.</span></code>, then another name.</p> <pre><span class='Value'>example.b</span> -<span class='Brace'>{</span><span class='Value'>n</span><span class='Gets'>⇐</span><span class='Number'>7</span><span class='Brace'>}</span><span class='Number'>.n</span> +<span class='Brace'>{</span><span class='Value'>n</span><span class='Gets'>⇐</span><span class='Number'>7</span><span class='Brace'>}</span><span class='Value'>.n</span> </pre> <p>The syntax is any subject followed by a dot and then a name. This can be chained like <code><span class='Value'>a.b.c</span></code> if a namespace has a value that is also a namespace (and so on).</p> diff --git a/docs/doc/oop.html b/docs/doc/oop.html index a683a550..c2c597db 100644 --- a/docs/doc/oop.html +++ b/docs/doc/oop.html @@ -65,7 +65,7 @@ </tbody> </table> <h2 id="objects">Objects</h2> -<p>An object in BQN is simply a namespace: its fields and methods are variables in the namespace, and one of these can be accessed outside of the namespace with dot syntax if it's exported with <code><span class='Gets'>⇐</span></code>. Unexported variables are instance-private in OOP parlance, meaning that only they're only visible to the object containing them. They could be utilities, or hold state for the object. As an example, the object below implements the <a href="https://en.wikipedia.org/wiki/Tower_of_Hanoi">Tower of Hanoi</a> puzzle with five disks. You can view the state (a list of disks occupying each of the three rods) with <code><span class='Value'>towerOfHanoi.View</span></code>, or move the top disk from one rod to another with <code><span class='Value'>towerOfHanoi.Move</span></code>.</p> +<p>An object in BQN is simply a namespace: its fields and methods are variables in the namespace, and one of these can be accessed outside of the namespace with dot syntax if it's exported with <code><span class='Gets'>⇐</span></code>. Unexported variables are instance-private in OOP parlance, meaning that only they're only visible to the object containing them. They could be utilities, or hold state for the object. As an example, the object below implements the <a href="https://en.wikipedia.org/wiki/Tower_of_Hanoi">Tower of Hanoi</a> puzzle with five disks. You can view the state (a list of disks occupying each of the three rods) with <code><span class='Value'>towerOfHanoi.</span><span class='Function'>View</span></code>, or move the top disk from one rod to another with <code><span class='Value'>towerOfHanoi.</span><span class='Function'>Move</span></code>.</p> <pre><span class='Value'>towerOfHanoi</span> <span class='Gets'>←</span> <span class='Brace'>{</span> <span class='Value'>l</span> <span class='Gets'>←</span> <span class='Function'>↕</span><span class='Modifier'>¨</span><span class='Number'>5</span><span class='Ligature'>‿</span><span class='Number'>0</span><span class='Ligature'>‿</span><span class='Number'>0</span> <span class='Function'>View</span> <span class='Gets'>⇐</span> <span class='Brace'>{</span><span class='Value'>𝕤</span> @@ -85,15 +85,15 @@ <p>Two fields <code><span class='Value'>l</span></code> and <code><span class='Function'>Transfer</span></code> aren't exported, for two different reasons. <code><span class='Value'>l</span></code> encodes the state of the tower, but it's often better to expose it with the function <code><span class='Function'>View</span></code> instead to allow the internal representation to be changed freely. <code><span class='Function'>Transfer</span></code> is just a utility function. While it's not dangerous to use outside of the object, there's no reason to expose it through <code><span class='Value'>towerOfHanoi</span></code>'s interface. If it's wanted in another place it should be moved to a common location.</p> <p>Here are the results of a few applications of these functions.</p> <pre> <span class='Value'>t</span> <span class='Gets'>←</span> <span class='Value'>towerOfHanoi</span> - <span class='Value'>t.View</span><span class='String'>@</span> + <span class='Value'>t.</span><span class='Function'>View</span><span class='String'>@</span> <span class='Bracket'>⟨</span> <span class='Bracket'>⟨</span> <span class='Number'>0</span> <span class='Number'>1</span> <span class='Number'>2</span> <span class='Number'>3</span> <span class='Number'>4</span> <span class='Bracket'>⟩</span> <span class='Bracket'>⟨⟩</span> <span class='Bracket'>⟨⟩</span> <span class='Bracket'>⟩</span> - <span class='Value'>t.Move</span> <span class='Number'>0</span><span class='Ligature'>‿</span><span class='Number'>2</span> + <span class='Value'>t.</span><span class='Function'>Move</span> <span class='Number'>0</span><span class='Ligature'>‿</span><span class='Number'>2</span> <span class='Bracket'>⟨</span> <span class='Bracket'>⟨</span> <span class='Number'>1</span> <span class='Number'>2</span> <span class='Number'>3</span> <span class='Number'>4</span> <span class='Bracket'>⟩</span> <span class='Bracket'>⟨⟩</span> <span class='Bracket'>⟨</span> <span class='Number'>0</span> <span class='Bracket'>⟩</span> <span class='Bracket'>⟩</span> - <span class='Value'>t.Move</span> <span class='Number'>1</span><span class='Ligature'>‿</span><span class='Number'>2</span> + <span class='Value'>t.</span><span class='Function'>Move</span> <span class='Number'>1</span><span class='Ligature'>‿</span><span class='Number'>2</span> <span class='Function'>!</span> <span class='String'>"No disk to move"</span> - <span class='Value'>t.Move</span> <span class='Number'>0</span><span class='Ligature'>‿</span><span class='Number'>1</span> + <span class='Value'>t.</span><span class='Function'>Move</span> <span class='Number'>0</span><span class='Ligature'>‿</span><span class='Number'>1</span> <span class='Bracket'>⟨</span> <span class='Bracket'>⟨</span> <span class='Number'>2</span> <span class='Number'>3</span> <span class='Number'>4</span> <span class='Bracket'>⟩</span> <span class='Bracket'>⟨</span> <span class='Number'>1</span> <span class='Bracket'>⟩</span> <span class='Bracket'>⟨</span> <span class='Number'>0</span> <span class='Bracket'>⟩</span> <span class='Bracket'>⟩</span> - <span class='Value'>t.Move</span> <span class='Number'>2</span><span class='Ligature'>‿</span><span class='Number'>1</span> + <span class='Value'>t.</span><span class='Function'>Move</span> <span class='Number'>2</span><span class='Ligature'>‿</span><span class='Number'>1</span> <span class='Bracket'>⟨</span> <span class='Bracket'>⟨</span> <span class='Number'>2</span> <span class='Number'>3</span> <span class='Number'>4</span> <span class='Bracket'>⟩</span> <span class='Bracket'>⟨</span> <span class='Number'>0</span> <span class='Number'>1</span> <span class='Bracket'>⟩</span> <span class='Bracket'>⟨⟩</span> <span class='Bracket'>⟩</span> </pre> <h2 id="classes">Classes</h2> @@ -119,18 +119,18 @@ <pre><span class='Function'>MakeQueue</span> <span class='Gets'>←</span> <span class='Brace'>{</span><span class='Value'>𝕤</span> <span class='Value'>t</span><span class='Gets'>←</span><span class='Value'>h</span><span class='Gets'>←</span><span class='Value'>e</span><span class='Gets'>←</span><span class='Brace'>{</span><span class='Function'>SetN</span><span class='Gets'>⇐</span><span class='Brace'>{</span><span class='Value'>h</span><span class='Gets'>↩</span><span class='Value'>𝕩</span><span class='Brace'>}}</span> <span class='Function'>Node</span><span class='Gets'>←</span><span class='Brace'>{</span><span class='Value'>v</span><span class='Gets'>⇐</span><span class='Value'>𝕩</span><span class='Separator'>⋄</span><span class='Value'>n</span><span class='Gets'>⇐</span><span class='Value'>e</span> <span class='Separator'>⋄</span> <span class='Function'>SetN</span><span class='Gets'>⇐</span><span class='Brace'>{</span><span class='Value'>n</span><span class='Gets'>↩</span><span class='Value'>𝕩</span><span class='Brace'>}}</span> - <span class='Function'>Push</span><span class='Gets'>⇐</span><span class='Brace'>{</span><span class='Value'>t.SetN</span> <span class='Value'>n</span><span class='Gets'>←</span><span class='Function'>Node</span> <span class='Value'>𝕩</span> <span class='Separator'>⋄</span> <span class='Value'>t</span><span class='Gets'>↩</span><span class='Value'>n</span><span class='Brace'>}</span> + <span class='Function'>Push</span><span class='Gets'>⇐</span><span class='Brace'>{</span><span class='Value'>t.</span><span class='Function'>SetN</span> <span class='Value'>n</span><span class='Gets'>←</span><span class='Function'>Node</span> <span class='Value'>𝕩</span> <span class='Separator'>⋄</span> <span class='Value'>t</span><span class='Gets'>↩</span><span class='Value'>n</span><span class='Brace'>}</span> <span class='Function'>Pop</span> <span class='Gets'>⇐</span><span class='Brace'>{</span><span class='Value'>𝕤</span><span class='Separator'>⋄</span><span class='Value'>v</span><span class='Gets'>←</span><span class='Value'>h.v</span><span class='Separator'>⋄</span><span class='Brace'>{</span><span class='Value'>t</span><span class='Gets'>↩</span><span class='Value'>𝕩</span><span class='Brace'>}</span><span class='Modifier2'>⍟</span><span class='Paren'>(</span><span class='Value'>e</span><span class='Modifier2'>⊸</span><span class='Function'>=</span><span class='Paren'>)</span><span class='Value'>h</span><span class='Gets'>↩</span><span class='Value'>h.n</span><span class='Separator'>⋄</span><span class='Value'>v</span><span class='Brace'>}</span> <span class='Brace'>}</span> </pre> -<p>Unlike a stack, a node's successor isn't known when it's created, and it has to be set. You might be inclined to make <code><span class='Value'>n</span></code> settable directly, but we'll get more mileage out of a setter function <code><span class='Function'>SetN</span></code>. This allows us to create a pseudo-node <code><span class='Value'>e</span></code> (for "empty") indicating there are no values in the queue. Because it has no <code><span class='Number'>.v</span></code> field, if <code><span class='Value'>h</span></code> is <code><span class='Value'>e</span></code> then <code><span class='Function'>Pop</span></code> gives an error (but in a real implementation you'd want to test explicitly instead in order to give an appropriate error message). In fact it doesn't have an <code><span class='Value'>n</span></code> field, and essentially uses the queue head <code><span class='Value'>h</span></code> instead. With this empty "node", the queue definition is straightforward. The only tricky part to remember is that if <code><span class='Function'>Pop</span></code> removes the last node, resulting in <code><span class='Value'>e</span><span class='Function'>=</span><span class='Value'>h</span></code>, then the tail has to be set to <code><span class='Value'>e</span></code> as well, or it will keep pointing to the removed node and cause bugs.</p> +<p>Unlike a stack, a node's successor isn't known when it's created, and it has to be set. You might be inclined to make <code><span class='Value'>n</span></code> settable directly, but we'll get more mileage out of a setter function <code><span class='Function'>SetN</span></code>. This allows us to create a pseudo-node <code><span class='Value'>e</span></code> (for "empty") indicating there are no values in the queue. Because it has no <code><span class='Value'>.v</span></code> field, if <code><span class='Value'>h</span></code> is <code><span class='Value'>e</span></code> then <code><span class='Function'>Pop</span></code> gives an error (but in a real implementation you'd want to test explicitly instead in order to give an appropriate error message). In fact it doesn't have an <code><span class='Value'>n</span></code> field, and essentially uses the queue head <code><span class='Value'>h</span></code> instead. With this empty "node", the queue definition is straightforward. The only tricky part to remember is that if <code><span class='Function'>Pop</span></code> removes the last node, resulting in <code><span class='Value'>e</span><span class='Function'>=</span><span class='Value'>h</span></code>, then the tail has to be set to <code><span class='Value'>e</span></code> as well, or it will keep pointing to the removed node and cause bugs.</p> <h2 id="composition">Composition</h2> <p>BQN classes don't support inheritance because there's no way to extend an existing class with new fields. But a lot of OOP enthusiasts these days are promoting <a href="https://en.wikipedia.org/wiki/Composition_over_inheritance">composition over inheritance</a>, and here BQN does pretty well. Forwarding methods from another class is as simple as a multiple assignment, like <code><span class='Bracket'>⟨</span><span class='Function'>View</span><span class='Bracket'>⟩</span></code> below (in a real program <code><span class='Value'>undoableTowerOfHanoi</span></code> should almost certainly be a class, but I introduced <code><span class='Value'>towerOfHanoi</span></code> before classes, and I'm not about to write it again just to add an <code><span class='Value'>𝕤</span></code>).</p> <pre><span class='Value'>undoableTowerOfHanoi</span> <span class='Gets'>←</span> <span class='Brace'>{</span> <span class='Function'>Push</span><span class='Ligature'>‿</span><span class='Function'>Pop</span> <span class='Gets'>←</span> <span class='Function'>MakeStack</span><span class='String'>@</span> <span class='Comment'># Copy methods as private </span> <span class='Bracket'>⟨</span><span class='Function'>View</span><span class='Bracket'>⟩</span> <span class='Gets'>⇐</span> <span class='Value'>t</span><span class='Gets'>←</span><span class='Value'>towerOfHanoi</span> <span class='Comment'># Copy and export -</span> <span class='Function'>Move</span> <span class='Gets'>⇐</span> <span class='Value'>t.Move</span> <span class='Function'>⊣</span> <span class='Function'>Push</span> - <span class='Function'>Undo</span> <span class='Gets'>⇐</span> <span class='Value'>t.Move</span><span class='Modifier2'>∘</span><span class='Function'>⌽</span><span class='Modifier2'>∘</span><span class='Function'>Pop</span> +</span> <span class='Function'>Move</span> <span class='Gets'>⇐</span> <span class='Value'>t.</span><span class='Function'>Move</span> <span class='Function'>⊣</span> <span class='Function'>Push</span> + <span class='Function'>Undo</span> <span class='Gets'>⇐</span> <span class='Value'>t.</span><span class='Function'>Move</span><span class='Modifier2'>∘</span><span class='Function'>⌽</span><span class='Modifier2'>∘</span><span class='Function'>Pop</span> <span class='Brace'>}</span> </pre> <p>This class composes a Tower of Hanoi with an undo stack that stores previous moves. To undo a move from <code><span class='Value'>a</span></code> to <code><span class='Value'>b</span></code>, it moves from <code><span class='Value'>b</span></code> to <code><span class='Value'>a</span></code>, although if you felt really fancy you might define <code><span class='Function'>Move</span><span class='Modifier'>⁼</span></code> in <code><span class='Value'>towerOfHanoi</span></code> instead with <code><span class='Function'>𝕊</span><span class='Modifier'>⁼</span><span class='Value'>𝕩:</span> <span class='Function'>𝕊⌽</span><span class='Value'>𝕩</span></code>.</p> diff --git a/docs/running.html b/docs/running.html index 2e1e9892..48c05f6e 100644 --- a/docs/running.html +++ b/docs/running.html @@ -17,7 +17,7 @@ <p>You can run <code><span class='Value'>dzref</span></code> from ordinary dzaima/BQN using the <code><span class='Function'>•Import</span></code> command; see for example <a href="https://github.com/mlochbaum/BQN/blob/master/wcshim.bqn">wcshim.bqn</a>. For testing, it is run as a Unix script, in which case it depends on an executable <code><span class='Value'>dbqn</span></code> that runs dzaima/BQN on a file argument. I use the following script, using the path to a clone of dzaima/BQN for the jar file.</p> <pre><span class='Comment'>#! /bin/bash </span> -<span class='Value'>java</span> <span class='Function'>-</span><span class='Value'>jar</span> <span class='Function'>/</span><span class='Value'>path</span><span class='Function'>/</span><span class='Value'>to</span><span class='Function'>/</span><span class='Value'>dzaima</span><span class='Function'>/BQN/BQN.jar</span> <span class='Function'>-</span><span class='Value'>f</span> <span class='String'>"$@"</span> +<span class='Value'>java</span> <span class='Function'>-</span><span class='Value'>jar</span> <span class='Function'>/</span><span class='Value'>path</span><span class='Function'>/</span><span class='Value'>to</span><span class='Function'>/</span><span class='Value'>dzaima</span><span class='Function'>/BQN/BQN</span><span class='Value'>.jar</span> <span class='Function'>-</span><span class='Value'>f</span> <span class='String'>"$@"</span> </pre> <p>The left argument for <code><span class='Function'>•Import</span></code> or the shell arguments can contain up to two arguments for the script. The first is a file to run, and the second is BQN code to be run after it.</p> <h3 id="bqn2ngn">BQN2NGN</h3> diff --git a/docs/tutorial/list.html b/docs/tutorial/list.html index b8d8ffba..e4b80056 100644 --- a/docs/tutorial/list.html +++ b/docs/tutorial/list.html @@ -231,7 +231,7 @@ <a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=4oi+wrQg4p+oICJjb24iLCAiY2F0IiwgImVuYXQiLCAiZSIg4p+p">↗️</a><pre> <span class='Function'>∾</span><span class='Modifier'>´</span> <span class='Bracket'>⟨</span> <span class='String'>"con"</span><span class='Separator'>,</span> <span class='String'>"cat"</span><span class='Separator'>,</span> <span class='String'>"enat"</span><span class='Separator'>,</span> <span class='String'>"e"</span> <span class='Bracket'>⟩</span> "concatenate" </pre> -<p>But you shouldn't! Just <code><span class='Function'>∾</span></code> will do the job for you—with no left argument it's just called "Join" (it's like Javascript's <code><span class='Number'>.join</span><span class='Paren'>()</span></code>, but with no separator and not specific to strings). And it could do more jobs if you had more dimensions. But I'm sure that's the furthest thing from your mind.</p> +<p>But you shouldn't! Just <code><span class='Function'>∾</span></code> will do the job for you—with no left argument it's just called "Join" (it's like Javascript's <code><span class='Value'>.join</span><span class='Paren'>()</span></code>, but with no separator and not specific to strings). And it could do more jobs if you had more dimensions. But I'm sure that's the furthest thing from your mind.</p> <a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=4oi+IOKfqCAiY29uIiwgImNhdCIsICJlbmF0IiwgImUiIOKfqQ==">↗️</a><pre> <span class='Function'>∾</span> <span class='Bracket'>⟨</span> <span class='String'>"con"</span><span class='Separator'>,</span> <span class='String'>"cat"</span><span class='Separator'>,</span> <span class='String'>"enat"</span><span class='Separator'>,</span> <span class='String'>"e"</span> <span class='Bracket'>⟩</span> "concatenate" </pre> |
