aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/doc/index.html1
-rw-r--r--docs/doc/primitive.html2
-rw-r--r--docs/doc/repeat.html56
3 files changed, 58 insertions, 1 deletions
diff --git a/docs/doc/index.html b/docs/doc/index.html
index 9e75330b..484a7227 100644
--- a/docs/doc/index.html
+++ b/docs/doc/index.html
@@ -51,6 +51,7 @@
<li><a href="order.html">Ordering functions</a> (<code><span class='Function'>∧∨⍋⍒</span></code>)</li>
<li><a href="prefixes.html">Prefixes and Suffixes</a> (<code><span class='Function'>↑↓</span></code>)</li>
<li><a href="range.html">Range</a> (<code><span class='Function'>↕</span></code>)</li>
+<li><a href="repeat.html">Repeat</a> (<code><span class='Modifier2'>⍟</span></code>)</li>
<li><a href="reverse.html">Reverse and Rotate</a> (<code><span class='Function'>⌽</span></code>)</li>
<li><a href="scan.html">Scan</a> (<code><span class='Modifier'>`</span></code>)</li>
<li><a href="selfcmp.html">Self-comparison functions</a> (<code><span class='Function'>⊐⊒∊⍷</span></code>)</li>
diff --git a/docs/doc/primitive.html b/docs/doc/primitive.html
index e7601d2c..4822d10a 100644
--- a/docs/doc/primitive.html
+++ b/docs/doc/primitive.html
@@ -508,7 +508,7 @@
<td><code><span class='Modifier'>⁼</span></code></td>
<td>Undo</td>
<td><code><span class='Modifier2'>⍟</span></code></td>
-<td>Repeat</td>
+<td><a href="repeat.html">Repeat</a></td>
</tr>
<tr>
<td><code><span class='Modifier'>´</span></code></td>
diff --git a/docs/doc/repeat.html b/docs/doc/repeat.html
new file mode 100644
index 00000000..2de6fd6e
--- /dev/null
+++ b/docs/doc/repeat.html
@@ -0,0 +1,56 @@
+<head>
+ <link href="../favicon.ico" rel="shortcut icon" type="image/x-icon"/>
+ <link href="../style.css" rel="stylesheet"/>
+ <title>BQN: The Repeat modifier</title>
+</head>
+<div class="nav"><a href="https://github.com/mlochbaum/BQN">BQN</a> / <a href="../index.html">main</a> / <a href="index.html">doc</a></div>
+<h1 id="the-repeat-modifier">The Repeat modifier</h1>
+<p>Repeat (<code><span class='Modifier2'>⍟</span></code>) is a 2-modifier that applies its operand function <code><span class='Function'>𝔽</span></code> multiple times.</p>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=wrvCu8K7ICJBQkNERSIKCsK74o2fMyAiQUJDREUi">↗️</a><pre> <span class='Function'>»»»</span> <span class='String'>&quot;ABCDE&quot;</span>
+" AB"
+
+ <span class='Function'>»</span><span class='Modifier2'>⍟</span><span class='Number'>3</span> <span class='String'>&quot;ABCDE&quot;</span>
+" AB"
+</pre>
+<p>In mathematics (which unsurpisingly tends to use complicated terms to talk about an easy concept), this kind of repetition is called an <a href="https://en.wikipedia.org/wiki/Iterated_function">iterated function</a> and written with exponential notation. It's related to function composition <code><span class='Modifier2'>∘</span></code> in the same way that exponentiation (<code><span class='Function'>⋆</span></code>) relates to multiplication (<code><span class='Function'>×</span></code>): function iteration is repeated composition.</p>
+<pre><span class='Value'>n</span><span class='Function'>⋆</span><span class='Number'>4</span> <span class='Gets'>←→</span> <span class='Value'>n</span><span class='Function'>×</span><span class='Value'>n</span><span class='Function'>×</span><span class='Value'>n</span><span class='Function'>×</span><span class='Value'>n</span>
+<span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Number'>4</span> <span class='Gets'>←→</span> <span class='Function'>F</span><span class='Modifier2'>∘</span><span class='Function'>F</span><span class='Modifier2'>∘</span><span class='Function'>F</span><span class='Modifier2'>∘</span><span class='Function'>F</span>
+</pre>
+<p><code><span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Number'>0</span></code> repeats <code><span class='Function'>F</span></code> zero times, that is, does nothing. Like <code><span class='Value'>n</span><span class='Function'>⋆</span><span class='Number'>0</span></code> gives the multiplicative identity <code><span class='Number'>1</span></code>, <code><span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Number'>0</span></code> is the compositional <a href="identity.html">identity</a>, <code><span class='Function'>⊢</span></code>. Since <code><span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Number'>1</span></code> applies <code><span class='Function'>F</span></code> and <code><span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Number'>0</span></code> doesn't, Repeat might be pronounced &quot;if&quot; or &quot;conditional&quot; when <code><span class='Function'>𝔾</span></code> is boolean.</p>
+<p>BQN's Repeat modifier has some extra functionality relative to the mathematical version. It allows a left argument, and some extensions to the right operand <code><span class='Function'>𝔾</span></code>. As usual for 2-modifiers, <code><span class='Function'>𝔾</span></code> is actually a function that applies to the arguments to give a result. The result can be a natural number as shown above, or a negative number to Undo (<code><span class='Modifier'>⁼</span></code>) <code><span class='Function'>𝔽</span></code>, or an array of values.</p>
+<h2 id="left-argument">Left argument</h2>
+<p>If <code><span class='Value'>𝕨</span></code> is given, it's passed as the left argument to <code><span class='Function'>𝔽</span></code> for every invocation.</p>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=MyAr4o2fMiA3CjMgKyAzICsgNw==">↗️</a><pre> <span class='Number'>3</span> <span class='Function'>+</span><span class='Modifier2'>⍟</span><span class='Number'>2</span> <span class='Number'>7</span>
+13
+ <span class='Number'>3</span> <span class='Function'>+</span> <span class='Number'>3</span> <span class='Function'>+</span> <span class='Number'>7</span>
+13
+</pre>
+<p>This kind of composition can't be represented by <code><span class='Modifier2'>∘</span></code> anymore (you'd need a <a href="train.html">train</a>), but it's similar in spirit. <code><span class='Value'>𝕨</span> <span class='Function'>𝔽</span><span class='Modifier2'>⍟</span><span class='Value'>n</span> <span class='Value'>𝕩</span></code> is always equivalent to <code><span class='Value'>𝕨</span><span class='Modifier2'>⊸</span><span class='Function'>𝔽</span><span class='Modifier2'>⍟</span><span class='Value'>n</span> <span class='Value'>𝕩</span></code>, provided <code><span class='Value'>n</span></code> is a constant—not a function, as discussed in the next section.</p>
+<h2 id="dynamic-repetition-count">Dynamic repetition count</h2>
+<p>In the general case, <code><span class='Function'>𝔾</span></code> is a function, which is applied to all arguments to get the repetition count. That is, the <em>actual</em> count is <code><span class='Value'>𝕨</span><span class='Function'>𝔾</span><span class='Value'>𝕩</span></code>.</p>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=4oi+4p+cMeKNn+KKoiA0Cgox4oq4K+KNn+KJoCDihpU0">↗️</a><pre> <span class='Function'>∾</span><span class='Modifier2'>⟜</span><span class='Number'>1</span><span class='Modifier2'>⍟</span><span class='Function'>⊢</span> <span class='Number'>4</span>
+⟨ 4 1 1 1 1 ⟩
+
+ <span class='Number'>1</span><span class='Modifier2'>⊸</span><span class='Function'>+</span><span class='Modifier2'>⍟</span><span class='Function'>≠</span> <span class='Function'>↕</span><span class='Number'>4</span>
+⟨ 4 5 6 7 ⟩
+</pre>
+<p>The most common use is the case where <code><span class='Function'>𝔾</span></code> is a condition that returns <code><span class='Number'>0</span></code> or <code><span class='Number'>1</span></code>. Then Repeat simply applies <code><span class='Function'>𝔽</span></code> if the condition holds. For example, the following code halves numbers that are greater than 6.</p>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=w7fin5wy4o2fezY88J2VqX3CqCAz4oC/N+KAvzLigL8x4oC/OA==">↗️</a><pre> <span class='Function'>÷</span><span class='Modifier2'>⟜</span><span class='Number'>2</span><span class='Modifier2'>⍟</span><span class='Brace'>{</span><span class='Number'>6</span><span class='Function'>&lt;</span><span class='Value'>𝕩</span><span class='Brace'>}</span><span class='Modifier'>¨</span> <span class='Number'>3</span><span class='Ligature'>‿</span><span class='Number'>7</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'>8</span>
+⟨ 3 3.5 2 1 4 ⟩
+</pre>
+<p>If <code><span class='Value'>𝕨</span></code> is given, then <code><span class='Function'>𝔾</span></code> gets it as a left argument (to avoid this, use <code><span class='Value'>𝕨</span><span class='Modifier2'>⊸</span><span class='Function'>𝔽</span><span class='Modifier2'>⍟</span><span class='Function'>𝔾</span> <span class='Value'>𝕩</span></code>, which applies <code><span class='Function'>𝔾</span></code> to <code><span class='Value'>𝕩</span></code> only). This form also works well with a boolean condition.</p>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=MyDiiqPijZ88wqggMuKAvzTigL82ICAjIExlZnQgaWYgbGVzcywgaS5lLiBtaW5pbXVt">↗️</a><pre> <span class='Number'>3</span> <span class='Function'>⊣</span><span class='Modifier2'>⍟</span><span class='Function'>&lt;</span><span class='Modifier'>¨</span> <span class='Number'>2</span><span class='Ligature'>‿</span><span class='Number'>4</span><span class='Ligature'>‿</span><span class='Number'>6</span> <span class='Comment'># Left if less, i.e. minimum
+</span>⟨ 2 3 3 ⟩
+</pre>
+<h2 id="negative-repetition">Negative repetition</h2>
+<p>What does it mean to repeat a function a negative number of times? For a negative integer <code><span class='Function'>-</span><span class='Value'>n</span></code>, BQN defines <code><span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Paren'>(</span><span class='Function'>-</span><span class='Value'>n</span><span class='Paren'>)</span></code> to be <code><span class='Function'>F</span><span class='Modifier'>⁼</span><span class='Modifier2'>⍟</span><span class='Value'>n</span></code>. In particular, <code><span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Number'>¯1</span></code> simply undoes <code><span class='Function'>F</span></code>.</p>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=MSDijL3ijZ/CrzEgImFiY2RlIiAgIyBSb3RhdGUgYmFja3dhcmRz">↗️</a><pre> <span class='Number'>1</span> <span class='Function'>⌽</span><span class='Modifier2'>⍟</span><span class='Number'>¯1</span> <span class='String'>&quot;abcde&quot;</span> <span class='Comment'># Rotate backwards
+</span>"eabcd"
+</pre>
+<p>Because BQN's Undo is a little looser than a strict mathematical inverse, this is an extension of the function inverse written f⁻¹ in mathematics. As a result, it doesn't have all the same properties. For natural numbers, Repeat follows the rule that <code><span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Value'>m</span> <span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Value'>n</span> <span class='Value'>𝕩</span></code> is <code><span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Paren'>(</span><span class='Value'>m</span><span class='Function'>+</span><span class='Value'>n</span><span class='Paren'>)</span> <span class='Value'>𝕩</span></code>. For integers, we have <code><span class='Value'>𝕩</span> <span class='Function'>≡</span> <span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Value'>n</span> <span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Paren'>(</span><span class='Function'>-</span><span class='Value'>n</span><span class='Paren'>)</span> <span class='Value'>𝕩</span></code>, but not necessarily <code><span class='Value'>𝕩</span> <span class='Function'>≡</span> <span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Paren'>(</span><span class='Function'>-</span><span class='Value'>n</span><span class='Paren'>)</span> <span class='Function'>F</span><span class='Modifier2'>⍟</span><span class='Value'>n</span> <span class='Value'>𝕩</span></code>.</p>
+<h2 id="array-of-repetition-counts">Array of repetition counts</h2>
+<p>The value of <code><span class='Value'>𝕨</span><span class='Function'>𝔾</span><span class='Value'>𝕩</span></code> might also be an array, whose elements are any valid repetition values—integers, or other arrays. Each integer in the nested structure is replaced with the result of repeating <code><span class='Function'>𝔽</span></code> that many times.</p>
+<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=MuKKuMOX4o2f4p+oMizin6g0LMKvMiwx4p+p4p+pIDE=">↗️</a><pre> <span class='Number'>2</span><span class='Modifier2'>⊸</span><span class='Function'>×</span><span class='Modifier2'>⍟</span><span class='Bracket'>⟨</span><span class='Number'>2</span><span class='Separator'>,</span><span class='Bracket'>⟨</span><span class='Number'>4</span><span class='Separator'>,</span><span class='Number'>¯2</span><span class='Separator'>,</span><span class='Number'>1</span><span class='Bracket'>⟩⟩</span> <span class='Number'>1</span>
+⟨ 4 ⟨ 16 0.25 2 ⟩ ⟩
+</pre>
+<p>Regardless of how numbers in <code><span class='Value'>𝕨</span><span class='Function'>𝔾</span><span class='Value'>𝕩</span></code> are arranged, <code><span class='Function'>𝔽</span></code> is evaluated the minimum number of times required to find the result, and regular (positive) applications are all performed before reverse (negative) ones. So the pattern of application is entirely defined by the smallest and largest values given by <code><span class='Function'>𝔾</span></code>.</p>