aboutsummaryrefslogtreecommitdiff
path: root/docs/doc/block.html
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2022-07-13 16:37:06 -0400
committerMarshall Lochbaum <mwlochbaum@gmail.com>2022-07-13 17:30:24 -0400
commitaaac31f1668fe5516902ee7d2034e5c0e41667a6 (patch)
treefa20c0a1d8cdee2de4d8ae1a4aa87bca5ac29256 /docs/doc/block.html
parent80cab4ef3a715ae98eefcbea947269d731b04b2e (diff)
Support line breaks inside brackets in markdown BQN evaluation
Diffstat (limited to 'docs/doc/block.html')
-rw-r--r--docs/doc/block.html34
1 files changed, 23 insertions, 11 deletions
diff --git a/docs/doc/block.html b/docs/doc/block.html
index a79791df..ec9e4ed9 100644
--- a/docs/doc/block.html
+++ b/docs/doc/block.html
@@ -20,7 +20,11 @@
</pre>
<h2 id="headerless-blocks"><a class="header" href="#headerless-blocks">Headerless blocks</a></h2>
<p>In the simplest case a block is just a list of statements, which are executed to <em>evaluate</em> the block. A block with no special names like <code><span class='Value'>𝕨</span></code> or <code><span class='Value'>𝕩</span></code> is called an <em>immediate block</em>, and is evaluated as soon as it is reached. The only thing such a block does is group some statements, and create a scope for them so that definitions made there are discarded when the block finishes. Even this small amount of functionality could be useful; as an example the following program can build up an array from named components without polluting the rest of the program with those names.</p>
-<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=dXBkb3duIOKGkCB7IHVw4oaQ4oaVNSDii4QgZG93buKGkOKMvXVwIOKLhCB1cOKIvmRvd24gfQp1cGRvd24=">↗️</a><pre> <span class='Value'>updown</span> <span class='Gets'>←</span> <span class='Brace'>{</span> <span class='Value'>up</span><span class='Gets'>←</span><span class='Function'>↕</span><span class='Number'>5</span> <span class='Separator'>β‹„</span> <span class='Value'>down</span><span class='Gets'>←</span><span class='Function'>⌽</span><span class='Value'>up</span> <span class='Separator'>β‹„</span> <span class='Value'>up</span><span class='Function'>∾</span><span class='Value'>down</span> <span class='Brace'>}</span>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=dXBkb3duIOKGkCB7CiAgdXAg4oaQIOKGlTUKICBkb3duIOKGkCDijL11cAogIHVw4oi+ZG93bgp9CnVwZG93bg==">↗️</a><pre> <span class='Value'>updown</span> <span class='Gets'>←</span> <span class='Brace'>{</span>
+ <span class='Value'>up</span> <span class='Gets'>←</span> <span class='Function'>↕</span><span class='Number'>5</span>
+ <span class='Value'>down</span> <span class='Gets'>←</span> <span class='Function'>⌽</span><span class='Value'>up</span>
+ <span class='Value'>up</span><span class='Function'>∾</span><span class='Value'>down</span>
+ <span class='Brace'>}</span>
<span class='Value'>updown</span>
⟨ 0 1 2 3 4 4 3 2 1 0 ⟩
</pre>
@@ -139,9 +143,11 @@
<p>Because <code><span class='Value'>𝕣</span></code> only ever refers to a 1-modifier or 2-modifer, it can never make sense to refer to it as a function, and the uppercase letter <code><span class='Value'>ℝ</span></code> is not recognized by BQN. To allow <code><span class='Value'>𝕣</span></code> to be spelled as a 1-modifier <code><span class='Modifier'>_𝕣</span></code> or 2-modifier <code><span class='Modifier2'>_𝕣_</span></code>, it's tokenized as an ordinary identifier character, so it has to be separated from adjacent letters or numbers with a space.</p>
<h2 id="block-headers"><a class="header" href="#block-headers">Block headers</a></h2>
<p>As a program becomes larger, it often becomes necessary to name inputs to blocks rather than just using special names. It can also become difficult to identify what kind of block is being defined, as it requires scanning through the block for special names. A <em>block header</em>, which is separated from the body of a block by a colon <code><span class='Head'>:</span></code>, specifies the kind of block and can declare names for the block and its inputs.</p>
-<pre><span class='Function'>Fact</span> <span class='Gets'>←</span> <span class='Brace'>{</span> <span class='Function'>F</span> <span class='Value'>n</span><span class='Head'>:</span>
- <span class='Value'>n</span> <span class='Function'>Γ—</span> <span class='Paren'>(</span><span class='Number'>0</span><span class='Modifier2'>⊸</span><span class='Function'>&lt;</span><span class='Paren'>)</span><span class='Modifier2'>β—Ά</span><span class='Number'>1</span><span class='Ligature'>β€Ώ</span><span class='Function'>F</span> <span class='Value'>n</span><span class='Function'>-</span><span class='Number'>1</span>
-<span class='Brace'>}</span>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=RmFjdF9oZWFkIOKGkCB7IEYgbjoKICBuIMOXICgw4oq4PCnil7Yx4oC/RiBuLTEKfQpGYWN0X2hlYWQgNw==">↗️</a><pre> <span class='Function'>Fact_head</span> <span class='Gets'>←</span> <span class='Brace'>{</span> <span class='Function'>F</span> <span class='Value'>n</span><span class='Head'>:</span>
+ <span class='Value'>n</span> <span class='Function'>Γ—</span> <span class='Paren'>(</span><span class='Number'>0</span><span class='Modifier2'>⊸</span><span class='Function'>&lt;</span><span class='Paren'>)</span><span class='Modifier2'>β—Ά</span><span class='Number'>1</span><span class='Ligature'>β€Ώ</span><span class='Function'>F</span> <span class='Value'>n</span><span class='Function'>-</span><span class='Number'>1</span>
+ <span class='Brace'>}</span>
+ <span class='Function'>Fact_head</span> <span class='Number'>7</span>
+5040
</pre>
<p>Its syntax mirrors an application of the block. As suggested by the positioning, the names given in a header apply only inside the block: for example <code><span class='Function'>F</span></code> above is only defined inside the <code><span class='Brace'>{}</span></code> braces while <code><span class='Function'>Fact</span></code> could be used either outside or inside. Some other possibilites are given below.</p>
<pre><span class='Comment'># A dyadic function that refers to itself as Func
@@ -197,7 +203,11 @@
⟨ 2 'a' 'b' ⟩
</pre>
<p>Bodies with headers come before any that don't have them. When a block is called, its headers are checked in order for compatibility with the arguments, and the first body with a compatible header is used.</p>
-<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=Q2FzZUFkZCDihpAgeyAy8J2VijM6MOKAvzUgOyAy8J2VivCdlak64p+oMSwyK/Cdlanin6kgOyDwnZWK8J2VqToy4oC/8J2VqSB9CgoyIENhc2VBZGQgMwoKMiBDYXNlQWRkIDQKCiAgQ2FzZUFkZCA0">↗️</a><pre> <span class='Function'>CaseAdd</span> <span class='Gets'>←</span> <span class='Brace'>{</span> <span class='Number'>2</span><span class='Function'>π•Š</span><span class='Number'>3</span><span class='Head'>:</span><span class='Number'>0</span><span class='Ligature'>β€Ώ</span><span class='Number'>5</span> <span class='Head'>;</span> <span class='Number'>2</span><span class='Function'>π•Š</span><span class='Value'>𝕩</span><span class='Head'>:</span><span class='Bracket'>⟨</span><span class='Number'>1</span><span class='Separator'>,</span><span class='Number'>2</span><span class='Function'>+</span><span class='Value'>𝕩</span><span class='Bracket'>⟩</span> <span class='Head'>;</span> <span class='Function'>π•Š</span><span class='Value'>𝕩</span><span class='Head'>:</span><span class='Number'>2</span><span class='Ligature'>β€Ώ</span><span class='Value'>𝕩</span> <span class='Brace'>}</span>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=Q2FzZUFkZCDihpAgewogIDLwnZWKMzogMOKAvzUgOwogIDLwnZWK8J2VqTog4p+oMSwyK/Cdlanin6kgOwogICDwnZWK8J2VqTogMuKAv/CdlakKfQoKMiBDYXNlQWRkIDMKCjIgQ2FzZUFkZCA0CgogIENhc2VBZGQgNA==">↗️</a><pre> <span class='Function'>CaseAdd</span> <span class='Gets'>←</span> <span class='Brace'>{</span>
+ <span class='Number'>2</span><span class='Function'>π•Š</span><span class='Number'>3</span><span class='Head'>:</span> <span class='Number'>0</span><span class='Ligature'>β€Ώ</span><span class='Number'>5</span> <span class='Head'>;</span>
+ <span class='Number'>2</span><span class='Function'>π•Š</span><span class='Value'>𝕩</span><span class='Head'>:</span> <span class='Bracket'>⟨</span><span class='Number'>1</span><span class='Separator'>,</span><span class='Number'>2</span><span class='Function'>+</span><span class='Value'>𝕩</span><span class='Bracket'>⟩</span> <span class='Head'>;</span>
+ <span class='Function'>π•Š</span><span class='Value'>𝕩</span><span class='Head'>:</span> <span class='Number'>2</span><span class='Ligature'>β€Ώ</span><span class='Value'>𝕩</span>
+ <span class='Brace'>}</span>
<span class='Number'>2</span> <span class='Function'>CaseAdd</span> <span class='Number'>3</span>
⟨ 0 5 ⟩
@@ -214,12 +224,14 @@
</pre>
<h3 id="case-headers"><a class="header" href="#case-headers">Case headers</a></h3>
<p>A special rule allows for convenient case-matching syntax for one-argument functions. In any function header with one argument, the function name can be omitted as long as the argument is <em>not</em> a plain identifierβ€”it must be <code><span class='Value'>𝕩</span></code> or a compound value like a list to distinguish it from an immediate block label.</p>
-<pre><span class='Function'>Test</span> <span class='Gets'>←</span> <span class='Brace'>{</span>
- <span class='String'>&quot;abc&quot;</span><span class='Head'>:</span> <span class='String'>&quot;string&quot;</span> <span class='Head'>;</span>
- <span class='Bracket'>⟨</span><span class='Number'>2</span><span class='Separator'>,</span><span class='Value'>b</span><span class='Bracket'>⟩</span><span class='Head'>:</span> <span class='Function'>⌽</span><span class='Value'>𝕩</span> <span class='Head'>;</span>
- <span class='Number'>5</span><span class='Head'>:</span> <span class='String'>&quot;number&quot;</span> <span class='Head'>;</span>
- <span class='Value'>𝕩</span><span class='Head'>:</span> <span class='String'>&quot;default&quot;</span>
-<span class='Brace'>}</span>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=VGVzdCDihpAgewogICJhYmMiOiAic3RyaW5nIiA7CiAg4p+oMixi4p+pOiDijL3wnZWpICAgICAgIDsKICA1OiAgICAgIm51bWJlciIgOwogIPCdlak6ICAgICAiZGVmYXVsdCIKfQpUZXN0IDU=">↗️</a><pre> <span class='Function'>Test</span> <span class='Gets'>←</span> <span class='Brace'>{</span>
+ <span class='String'>&quot;abc&quot;</span><span class='Head'>:</span> <span class='String'>&quot;string&quot;</span> <span class='Head'>;</span>
+ <span class='Bracket'>⟨</span><span class='Number'>2</span><span class='Separator'>,</span><span class='Value'>b</span><span class='Bracket'>⟩</span><span class='Head'>:</span> <span class='Function'>⌽</span><span class='Value'>𝕩</span> <span class='Head'>;</span>
+ <span class='Number'>5</span><span class='Head'>:</span> <span class='String'>&quot;number&quot;</span> <span class='Head'>;</span>
+ <span class='Value'>𝕩</span><span class='Head'>:</span> <span class='String'>&quot;default&quot;</span>
+ <span class='Brace'>}</span>
+ <span class='Function'>Test</span> <span class='Number'>5</span>
+"number"
</pre>
<p>These case-style headers function exactly the same as if they were preceded by <code><span class='Function'>π•Š</span></code>, and can be mixed with other kinds of headers.</p>
<h3 id="predicates"><a class="header" href="#predicates">Predicates</a></h3>