aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/fromDyalog.md6
-rw-r--r--docs/doc/fromDyalog.html202
-rw-r--r--docs/implementation/vm.html296
-rw-r--r--docs/tutorial/list.html16
-rw-r--r--implementation/vm.md6
-rw-r--r--md.bqn13
-rw-r--r--tutorial/list.md2
7 files changed, 272 insertions, 269 deletions
diff --git a/doc/fromDyalog.md b/doc/fromDyalog.md
index 1818a094..42a2ffc7 100644
--- a/doc/fromDyalog.md
+++ b/doc/fromDyalog.md
@@ -37,19 +37,19 @@ Dyalog uses value types (array, function, and so on) to determine syntax while B
Here are some closest equivalents in Dyalog APL for the BQN functions that don't use the same glyphs as APL. Correspondence can be approximate, and `⌽` is just used as a decorator to mean "reverse some things".
| BQN | `⋆` | `√` | `∧` | `∨` | `¬` | `≠` | `<` | `>` | `≢` | `⥊` | `∾` | `≍` |
-|-------|-----|----------|-------|-------|-------|-----|-----|-----|-----|-----|-------|--------|
+|:-----:|:---:|:--------:|:-----:|:-----:|:-----:|:---:|:---:|:---:|:---:|:---:|:-----:|:------:|
| Monad | `*` | `*∘(÷2)` | `[⍋]` | `[⍒]` | `~` | `≢` | `⊂` | `↑` | `⍴` | `,` | `⊃,⌿` | `↑,⍥⊂` |
| Dyad | `*` | `*∘÷⍨` | `∧` | `∨` | `1+-` | `≠` | `<` | `>` | `≢` | `⍴` | `⍪` | `↑,⍥⊂` |
| BQN | `↑` | `↓` | `↕` | `/` | `⍋` | `⍒` | `⊏` | `⊑` | `⊐` | `⊒` | `∊` | `⍷` | `⊔` |
-|-------|------|---------|------|-----|-----|-------|------|-----|-----|-----|-----|-----|------------|
+|:-----:|:----:|:-------:|:----:|:---:|:---:|:-----:|:----:|:---:|:---:|:---:|:---:|:---:|:----------:|
| Monad | `,⍀` | `⌽,⌽⍀⌽` | `⍳` | `⍸` | `⍋` | `⍒` | `⊣⌿` | `⊃` | | `…` | `≠` | `∪` | `⌸` |
| Dyad | `↑` | `↓` | `,⌿` | `⌿` | `⍸` | `⌽⍸⌽` | `⌷` | `⊃` | `⍳` | `…` | `∊` | `⍷` | `⌸` or `⊆` |
Modifiers are a little harder. Many have equivalents in some cases, but Dyalog sometimes chooses different functionality based on whether the operand is an array. In BQN an array is always treated as a constant function.
| BQN | `¨` | `⌜` | `˝` | `⎉` | `⍟` | `˜` | `∘` | `○` | `⟜` |
-|--------|-----|------|-----|-----|-----|-----|-----|-----|-----|
+|:------:|:---:|:----:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| Dyalog | `¨` | `∘.` | `⌿` | `⍤` | `⍣` | `⍨` | `⍤` | `⍥` | `∘` |
In BQN `⎉` is Rank and `∘` is Atop. Dyalog's Atop (`⍤`) and Over (`⍥`) were added in version 18.0.
diff --git a/docs/doc/fromDyalog.html b/docs/doc/fromDyalog.html
index 96320db6..aa53a768 100644
--- a/docs/doc/fromDyalog.html
+++ b/docs/doc/fromDyalog.html
@@ -74,105 +74,105 @@
<table>
<thead>
<tr>
-<th>BQN</th>
-<th><code><span class='Function'>⋆</span></code></th>
-<th><code><span class='Function'>√</span></code></th>
-<th><code><span class='Function'>∧</span></code></th>
-<th><code><span class='Function'>∨</span></code></th>
-<th><code><span class='Function'>¬</span></code></th>
-<th><code><span class='Function'>≠</span></code></th>
-<th><code><span class='Function'>&lt;</span></code></th>
-<th><code><span class='Function'>&gt;</span></code></th>
-<th><code><span class='Function'>≢</span></code></th>
-<th><code><span class='Function'>⥊</span></code></th>
-<th><code><span class='Function'>∾</span></code></th>
-<th><code><span class='Function'>≍</span></code></th>
+<th align="center">BQN</th>
+<th align="center"><code><span class='Function'>⋆</span></code></th>
+<th align="center"><code><span class='Function'>√</span></code></th>
+<th align="center"><code><span class='Function'>∧</span></code></th>
+<th align="center"><code><span class='Function'>∨</span></code></th>
+<th align="center"><code><span class='Function'>¬</span></code></th>
+<th align="center"><code><span class='Function'>≠</span></code></th>
+<th align="center"><code><span class='Function'>&lt;</span></code></th>
+<th align="center"><code><span class='Function'>&gt;</span></code></th>
+<th align="center"><code><span class='Function'>≢</span></code></th>
+<th align="center"><code><span class='Function'>⥊</span></code></th>
+<th align="center"><code><span class='Function'>∾</span></code></th>
+<th align="center"><code><span class='Function'>≍</span></code></th>
</tr>
</thead>
<tbody>
<tr>
-<td>Monad</td>
-<td><code><span class='Value'>*</span></code></td>
-<td><code><span class='Value'>*</span><span class='Modifier2'>∘</span><span class='Paren'>(</span><span class='Function'>÷</span><span class='Number'>2</span><span class='Paren'>)</span></code></td>
-<td><code><span class='Value'>[</span><span class='Function'>⍋</span><span class='Value'>]</span></code></td>
-<td><code><span class='Value'>[</span><span class='Function'>⍒</span><span class='Value'>]</span></code></td>
-<td><code><span class='Value'>~</span></code></td>
-<td><code><span class='Function'>≢</span></code></td>
-<td><code><span class='Value'>⊂</span></code></td>
-<td><code><span class='Function'>↑</span></code></td>
-<td><code><span class='Value'>⍴</span></code></td>
-<td><code><span class='Separator'>,</span></code></td>
-<td><code><span class='Value'>⊃</span><span class='Separator'>,</span><span class='Value'>⌿</span></code></td>
-<td><code><span class='Function'>↑</span><span class='Separator'>,</span><span class='Value'>⍥⊂</span></code></td>
+<td align="center">Monad</td>
+<td align="center"><code><span class='Value'>*</span></code></td>
+<td align="center"><code><span class='Value'>*</span><span class='Modifier2'>∘</span><span class='Paren'>(</span><span class='Function'>÷</span><span class='Number'>2</span><span class='Paren'>)</span></code></td>
+<td align="center"><code><span class='Value'>[</span><span class='Function'>⍋</span><span class='Value'>]</span></code></td>
+<td align="center"><code><span class='Value'>[</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='Function'>≢</span></code></td>
+<td align="center"><code><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='Separator'>,</span></code></td>
+<td align="center"><code><span class='Value'>⊃</span><span class='Separator'>,</span><span class='Value'>⌿</span></code></td>
+<td align="center"><code><span class='Function'>↑</span><span class='Separator'>,</span><span class='Value'>⍥⊂</span></code></td>
</tr>
<tr>
-<td>Dyad</td>
-<td><code><span class='Value'>*</span></code></td>
-<td><code><span class='Value'>*</span><span class='Modifier2'>∘</span><span class='Function'>÷</span><span class='Value'>⍨</span></code></td>
-<td><code><span class='Function'>∧</span></code></td>
-<td><code><span class='Function'>∨</span></code></td>
-<td><code><span class='Number'>1</span><span class='Function'>+-</span></code></td>
-<td><code><span class='Function'>≠</span></code></td>
-<td><code><span class='Function'>&lt;</span></code></td>
-<td><code><span class='Function'>&gt;</span></code></td>
-<td><code><span class='Function'>≢</span></code></td>
-<td><code><span class='Value'>⍴</span></code></td>
-<td><code><span class='Value'>⍪</span></code></td>
-<td><code><span class='Function'>↑</span><span class='Separator'>,</span><span class='Value'>⍥⊂</span></code></td>
+<td align="center">Dyad</td>
+<td align="center"><code><span class='Value'>*</span></code></td>
+<td align="center"><code><span class='Value'>*</span><span class='Modifier2'>∘</span><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='Function'>∨</span></code></td>
+<td align="center"><code><span class='Number'>1</span><span class='Function'>+-</span></code></td>
+<td align="center"><code><span class='Function'>≠</span></code></td>
+<td align="center"><code><span class='Function'>&lt;</span></code></td>
+<td align="center"><code><span class='Function'>&gt;</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='Value'>⍪</span></code></td>
+<td align="center"><code><span class='Function'>↑</span><span class='Separator'>,</span><span class='Value'>⍥⊂</span></code></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
-<th>BQN</th>
-<th><code><span class='Function'>↑</span></code></th>
-<th><code><span class='Function'>↓</span></code></th>
-<th><code><span class='Function'>↕</span></code></th>
-<th><code><span class='Function'>/</span></code></th>
-<th><code><span class='Function'>⍋</span></code></th>
-<th><code><span class='Function'>⍒</span></code></th>
-<th><code><span class='Function'>⊏</span></code></th>
-<th><code><span class='Function'>⊑</span></code></th>
-<th><code><span class='Function'>⊐</span></code></th>
-<th><code><span class='Function'>⊒</span></code></th>
-<th><code><span class='Function'>∊</span></code></th>
-<th><code><span class='Function'>⍷</span></code></th>
-<th><code><span class='Function'>⊔</span></code></th>
+<th align="center">BQN</th>
+<th align="center"><code><span class='Function'>↑</span></code></th>
+<th align="center"><code><span class='Function'>↓</span></code></th>
+<th align="center"><code><span class='Function'>↕</span></code></th>
+<th align="center"><code><span class='Function'>/</span></code></th>
+<th align="center"><code><span class='Function'>⍋</span></code></th>
+<th align="center"><code><span class='Function'>⍒</span></code></th>
+<th align="center"><code><span class='Function'>⊏</span></code></th>
+<th align="center"><code><span class='Function'>⊑</span></code></th>
+<th align="center"><code><span class='Function'>⊐</span></code></th>
+<th align="center"><code><span class='Function'>⊒</span></code></th>
+<th align="center"><code><span class='Function'>∊</span></code></th>
+<th align="center"><code><span class='Function'>⍷</span></code></th>
+<th align="center"><code><span class='Function'>⊔</span></code></th>
</tr>
</thead>
<tbody>
<tr>
-<td>Monad</td>
-<td><code><span class='Separator'>,</span><span class='Value'>⍀</span></code></td>
-<td><code><span class='Function'>⌽</span><span class='Separator'>,</span><span class='Function'>⌽</span><span class='Value'>⍀</span><span class='Function'>⌽</span></code></td>
-<td><code><span class='Value'>⍳</span></code></td>
-<td><code><span class='Value'>⍸</span></code></td>
-<td><code><span class='Function'>⍋</span></code></td>
-<td><code><span class='Function'>⍒</span></code></td>
-<td><code><span class='Function'>⊣</span><span class='Value'>⌿</span></code></td>
-<td><code><span class='Value'>⊃</span></code></td>
-<td></td>
-<td><code><span class='Value'>…</span></code></td>
-<td><code><span class='Function'>≠</span></code></td>
-<td><code><span class='Value'>∪</span></code></td>
-<td><code><span class='Value'>⌸</span></code></td>
+<td align="center">Monad</td>
+<td align="center"><code><span class='Separator'>,</span><span class='Value'>⍀</span></code></td>
+<td align="center"><code><span class='Function'>⌽</span><span class='Separator'>,</span><span class='Function'>⌽</span><span class='Value'>⍀</span><span class='Function'>⌽</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></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='Value'>⊃</span></code></td>
+<td align="center"></td>
+<td align="center"><code><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='Value'>⌸</span></code></td>
</tr>
<tr>
-<td>Dyad</td>
-<td><code><span class='Function'>↑</span></code></td>
-<td><code><span class='Function'>↓</span></code></td>
-<td><code><span class='Separator'>,</span><span class='Value'>⌿</span></code></td>
-<td><code><span class='Value'>⌿</span></code></td>
-<td><code><span class='Value'>⍸</span></code></td>
-<td><code><span class='Function'>⌽</span><span class='Value'>⍸</span><span class='Function'>⌽</span></code></td>
-<td><code><span class='Value'>⌷</span></code></td>
-<td><code><span class='Value'>⊃</span></code></td>
-<td><code><span class='Value'>⍳</span></code></td>
-<td><code><span class='Value'>…</span></code></td>
-<td><code><span class='Function'>∊</span></code></td>
-<td><code><span class='Function'>⍷</span></code></td>
-<td><code><span class='Value'>⌸</span></code> or <code><span class='Value'>⊆</span></code></td>
+<td align="center">Dyad</td>
+<td align="center"><code><span class='Function'>↑</span></code></td>
+<td align="center"><code><span class='Function'>↓</span></code></td>
+<td align="center"><code><span class='Separator'>,</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='Value'>⍸</span><span class='Function'>⌽</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>
+<td align="center"><code><span class='Value'>…</span></code></td>
+<td align="center"><code><span class='Function'>∊</span></code></td>
+<td align="center"><code><span class='Function'>⍷</span></code></td>
+<td align="center"><code><span class='Value'>⌸</span></code> or <code><span class='Value'>⊆</span></code></td>
</tr>
</tbody>
</table>
@@ -180,30 +180,30 @@
<table>
<thead>
<tr>
-<th>BQN</th>
-<th><code><span class='Modifier'>¨</span></code></th>
-<th><code><span class='Modifier'>⌜</span></code></th>
-<th><code><span class='Modifier'>˝</span></code></th>
-<th><code><span class='Modifier2'>⎉</span></code></th>
-<th><code><span class='Modifier2'>⍟</span></code></th>
-<th><code><span class='Modifier'>˜</span></code></th>
-<th><code><span class='Modifier2'>∘</span></code></th>
-<th><code><span class='Modifier2'>○</span></code></th>
-<th><code><span class='Modifier2'>⟜</span></code></th>
+<th align="center">BQN</th>
+<th align="center"><code><span class='Modifier'>¨</span></code></th>
+<th align="center"><code><span class='Modifier'>⌜</span></code></th>
+<th align="center"><code><span class='Modifier'>˝</span></code></th>
+<th align="center"><code><span class='Modifier2'>⎉</span></code></th>
+<th align="center"><code><span class='Modifier2'>⍟</span></code></th>
+<th align="center"><code><span class='Modifier'>˜</span></code></th>
+<th align="center"><code><span class='Modifier2'>∘</span></code></th>
+<th align="center"><code><span class='Modifier2'>○</span></code></th>
+<th align="center"><code><span class='Modifier2'>⟜</span></code></th>
</tr>
</thead>
<tbody>
<tr>
-<td>Dyalog</td>
-<td><code><span class='Modifier'>¨</span></code></td>
-<td><code><span class='Modifier2'>∘</span><span class='Number'>.</span></code></td>
-<td><code><span class='Value'>⌿</span></code></td>
-<td><code><span class='Value'>⍤</span></code></td>
-<td><code><span class='Value'>⍣</span></code></td>
-<td><code><span class='Value'>⍨</span></code></td>
-<td><code><span class='Value'>⍤</span></code></td>
-<td><code><span class='Value'>⍥</span></code></td>
-<td><code><span class='Modifier2'>∘</span></code></td>
+<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='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>
+<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='Modifier2'>∘</span></code></td>
</tr>
</tbody>
</table>
diff --git a/docs/implementation/vm.html b/docs/implementation/vm.html
index c0608644..4805d6b1 100644
--- a/docs/implementation/vm.html
+++ b/docs/implementation/vm.html
@@ -36,221 +36,221 @@
<table>
<thead>
<tr>
-<th>B</th>
+<th align="right">B</th>
<th>Name</th>
-<th>Used</th>
-<th>Like</th>
-<th>Args</th>
+<th align="center">Used</th>
+<th align="right">Like</th>
+<th align="left">Args</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
-<td>0</td>
+<td align="right">0</td>
<td>PUSH</td>
-<td>X</td>
-<td></td>
-<td><code><span class='Function'>I</span></code></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"><code><span class='Function'>I</span></code></td>
<td>Push object <code><span class='Function'>I</span></code></td>
</tr>
<tr>
-<td>1</td>
+<td align="right">1</td>
<td>VARO</td>
-<td></td>
-<td></td>
-<td><code><span class='Function'>I</span></code></td>
+<td align="center"></td>
+<td align="right"></td>
+<td align="left"><code><span class='Function'>I</span></code></td>
<td>Push named variable <code><span class='Function'>I</span></code></td>
</tr>
<tr>
-<td>2</td>
+<td align="right">2</td>
<td>VARM</td>
-<td></td>
-<td></td>
-<td><code><span class='Function'>I</span></code></td>
+<td align="center"></td>
+<td align="right"></td>
+<td align="left"><code><span class='Function'>I</span></code></td>
<td>Push named variable <code><span class='Function'>I</span></code> reference</td>
</tr>
<tr>
-<td>3</td>
+<td align="right">3</td>
<td>ARRO</td>
-<td>X</td>
-<td></td>
-<td><code><span class='Function'>N</span></code></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"><code><span class='Function'>N</span></code></td>
<td>Create length-<code><span class='Function'>N</span></code> list</td>
</tr>
<tr>
-<td>4</td>
+<td align="right">4</td>
<td>ARRM</td>
-<td>X</td>
-<td>3</td>
-<td><code><span class='Function'>N</span></code></td>
+<td align="center">X</td>
+<td align="right">3</td>
+<td align="left"><code><span class='Function'>N</span></code></td>
<td>Create length-<code><span class='Function'>N</span></code> reference list</td>
</tr>
<tr>
-<td>5</td>
+<td align="right">5</td>
<td>FN1C</td>
-<td></td>
-<td></td>
-<td></td>
+<td align="center"></td>
+<td align="right"></td>
+<td align="left"></td>
<td>Monadic function call</td>
</tr>
<tr>
-<td>6</td>
+<td align="right">6</td>
<td>FN2C</td>
-<td></td>
-<td></td>
-<td></td>
+<td align="center"></td>
+<td align="right"></td>
+<td align="left"></td>
<td>Dyadic function call</td>
</tr>
<tr>
-<td>7</td>
+<td align="right">7</td>
<td>OP1D</td>
-<td>X</td>
-<td></td>
-<td></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"></td>
<td>1-modifier call</td>
</tr>
<tr>
-<td>8</td>
+<td align="right">8</td>
<td>OP2D</td>
-<td>X</td>
-<td></td>
-<td></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"></td>
<td>2-modifier call</td>
</tr>
<tr>
-<td>9</td>
+<td align="right">9</td>
<td>TR2D</td>
-<td>X</td>
-<td></td>
-<td></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"></td>
<td>Create 2-train</td>
</tr>
<tr>
-<td>10</td>
+<td align="right">10</td>
<td>TR3D</td>
-<td></td>
-<td></td>
-<td></td>
+<td align="center"></td>
+<td align="right"></td>
+<td align="left"></td>
<td>Create 3-train</td>
</tr>
<tr>
-<td>11</td>
+<td align="right">11</td>
<td>SETN</td>
-<td>X</td>
-<td></td>
-<td></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"></td>
<td>Define variable</td>
</tr>
<tr>
-<td>12</td>
+<td align="right">12</td>
<td>SETU</td>
-<td>X</td>
-<td></td>
-<td></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"></td>
<td>Change variable</td>
</tr>
<tr>
-<td>13</td>
+<td align="right">13</td>
<td>SETM</td>
-<td>X</td>
-<td></td>
-<td></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"></td>
<td>Modify variable</td>
</tr>
<tr>
-<td>14</td>
+<td align="right">14</td>
<td>POPS</td>
-<td>X</td>
-<td></td>
-<td></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"></td>
<td>Pop and discard top of stack</td>
</tr>
<tr>
-<td>15</td>
+<td align="right">15</td>
<td>DFND</td>
-<td>X</td>
-<td></td>
-<td><code><span class='Function'>I</span></code></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"><code><span class='Function'>I</span></code></td>
<td>Localize and push block <code><span class='Function'>I</span></code></td>
</tr>
<tr>
-<td>16</td>
+<td align="right">16</td>
<td>FN1O</td>
-<td>X</td>
-<td>5</td>
-<td></td>
+<td align="center">X</td>
+<td align="right">5</td>
+<td align="left"></td>
<td>Monadic call, checking for <code><span class='Nothing'>·</span></code></td>
</tr>
<tr>
-<td>17</td>
+<td align="right">17</td>
<td>FN2O</td>
-<td>X</td>
-<td>6</td>
-<td></td>
+<td align="center">X</td>
+<td align="right">6</td>
+<td align="left"></td>
<td>Dyadic call, checking for <code><span class='Nothing'>·</span></code></td>
</tr>
<tr>
-<td>18</td>
+<td align="right">18</td>
<td>CHKV</td>
-<td></td>
-<td></td>
-<td></td>
+<td align="center"></td>
+<td align="right"></td>
+<td align="left"></td>
<td>Error if top of stack is <code><span class='Nothing'>·</span></code></td>
</tr>
<tr>
-<td>19</td>
+<td align="right">19</td>
<td>TR3O</td>
-<td>X</td>
-<td>10</td>
-<td></td>
+<td align="center">X</td>
+<td align="right">10</td>
+<td align="left"></td>
<td>Create 3-train, checking for <code><span class='Nothing'>·</span></code></td>
</tr>
<tr>
-<td>20</td>
+<td align="right">20</td>
<td>OP2H</td>
-<td></td>
-<td></td>
-<td></td>
+<td align="center"></td>
+<td align="right"></td>
+<td align="left"></td>
<td>Bind right operand to 2-modifier</td>
</tr>
<tr>
-<td>21</td>
+<td align="right">21</td>
<td>LOCO</td>
-<td>X</td>
-<td></td>
-<td><code><span class='Function'>D</span></code>, <code><span class='Function'>I</span></code></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"><code><span class='Function'>D</span></code>, <code><span class='Function'>I</span></code></td>
<td>Push local variable <code><span class='Function'>I</span></code> from <code><span class='Function'>D</span></code> frames up</td>
</tr>
<tr>
-<td>22</td>
+<td align="right">22</td>
<td>LOCM</td>
-<td>X</td>
-<td></td>
-<td><code><span class='Function'>D</span></code>, <code><span class='Function'>I</span></code></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"><code><span class='Function'>D</span></code>, <code><span class='Function'>I</span></code></td>
<td>Push local variable reference <code><span class='Function'>I</span></code> from <code><span class='Function'>D</span></code> frames up</td>
</tr>
<tr>
-<td>23</td>
+<td align="right">23</td>
<td>VFYM</td>
-<td></td>
-<td></td>
-<td></td>
+<td align="center"></td>
+<td align="right"></td>
+<td align="left"></td>
<td>Convert to matcher (for header tests)</td>
</tr>
<tr>
-<td>24</td>
+<td align="right">24</td>
<td>SETH</td>
-<td></td>
-<td></td>
-<td></td>
+<td align="center"></td>
+<td align="right"></td>
+<td align="left"></td>
<td>Test header</td>
</tr>
<tr>
-<td>25</td>
+<td align="right">25</td>
<td>RETN</td>
-<td>X</td>
-<td></td>
-<td></td>
+<td align="center">X</td>
+<td align="right"></td>
+<td align="left"></td>
<td>Returns top of stack</td>
</tr>
</tbody>
@@ -259,7 +259,7 @@
<table>
<thead>
<tr>
-<th>B</th>
+<th align="right">B</th>
<th>Name</th>
<th>Stack effect</th>
<th>Comments</th>
@@ -267,103 +267,103 @@
</thead>
<tbody>
<tr>
-<td>0</td>
+<td align="right">0</td>
<td>PUSH</td>
<td><code><span class='Gets'>→</span> <span class='Paren'>(</span><span class='Value'>i</span><span class='Function'>⊑</span><span class='Value'>consts</span><span class='Paren'>)</span></code></td>
<td></td>
</tr>
<tr>
-<td>3</td>
+<td align="right">3</td>
<td>ARRO</td>
<td><code><span class='Value'>x0</span> <span class='Value'>…</span> <span class='Value'>xm</span> <span class='Gets'>→</span> <span class='Bracket'>⟨</span><span class='Value'>x0</span> <span class='Value'>…</span> <span class='Value'>xm</span><span class='Bracket'>⟩</span></code></td>
<td><code><span class='Function'>N</span></code> total variables (<code><span class='Value'>m</span><span class='Function'>=</span><span class='Value'>n</span><span class='Function'>-</span><span class='Number'>1</span></code>)</td>
</tr>
<tr>
-<td>5</td>
+<td align="right">5</td>
<td>FN1C</td>
<td><code><span class='Value'>𝕩</span> <span class='Value'>𝕤</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Function'>𝕊</span> <span class='Value'>𝕩</span><span class='Paren'>)</span></code></td>
<td>16: <code><span class='Value'>𝕩</span></code> may be <code><span class='Nothing'>·</span></code></td>
</tr>
<tr>
-<td>6</td>
+<td align="right">6</td>
<td>FN2C</td>
<td><code><span class='Value'>𝕩</span> <span class='Value'>𝕤</span> <span class='Value'>𝕨</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Value'>𝕨</span> <span class='Function'>𝕊</span> <span class='Value'>𝕩</span><span class='Paren'>)</span></code></td>
<td>17: <code><span class='Value'>𝕨</span></code> or <code><span class='Value'>𝕩</span></code> may be <code><span class='Nothing'>·</span></code></td>
</tr>
<tr>
-<td>7</td>
+<td align="right">7</td>
<td>OP1D</td>
<td><code><span class='Value'>𝕣</span> <span class='Value'>𝕗</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Function'>𝔽</span> <span class='Modifier'>_𝕣</span><span class='Paren'>)</span></code></td>
<td></td>
</tr>
<tr>
-<td>8</td>
+<td align="right">8</td>
<td>OP2D</td>
<td><code><span class='Value'>𝕘</span> <span class='Value'>𝕣</span> <span class='Value'>𝕗</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Function'>𝔽</span> <span class='Modifier2'>_𝕣_</span> <span class='Function'>𝔾</span><span class='Paren'>)</span></code></td>
<td></td>
</tr>
<tr>
-<td>9</td>
+<td align="right">9</td>
<td>TR2D</td>
<td><code><span class='Value'>g</span> <span class='Value'>f</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Function'>F</span> <span class='Function'>G</span><span class='Paren'>)</span></code></td>
<td></td>
</tr>
<tr>
-<td>10</td>
+<td align="right">10</td>
<td>TR3D</td>
<td><code><span class='Value'>h</span> <span class='Value'>g</span> <span class='Value'>f</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Function'>F</span> <span class='Function'>G</span> <span class='Function'>H</span><span class='Paren'>)</span></code></td>
<td>19: <code><span class='Function'>F</span></code> may be <code><span class='Nothing'>·</span></code></td>
</tr>
<tr>
-<td>11</td>
+<td align="right">11</td>
<td>SETN</td>
<td><code><span class='Value'>x</span> <span class='Value'>r</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Value'>r</span><span class='Gets'>←</span><span class='Value'>x</span><span class='Paren'>)</span></code></td>
<td><code><span class='Value'>r</span></code> is a reference</td>
</tr>
<tr>
-<td>12</td>
+<td align="right">12</td>
<td>SETU</td>
<td><code><span class='Value'>x</span> <span class='Value'>r</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Value'>r</span><span class='Gets'>↩</span><span class='Value'>x</span><span class='Paren'>)</span></code></td>
<td><code><span class='Value'>r</span></code> is a reference</td>
</tr>
<tr>
-<td>13</td>
+<td align="right">13</td>
<td>SETM</td>
<td><code><span class='Value'>x</span> <span class='Value'>f</span> <span class='Value'>r</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Value'>r</span> <span class='Function'>F</span><span class='Gets'>↩</span> <span class='Value'>x</span><span class='Paren'>)</span></code></td>
<td><code><span class='Value'>r</span></code> is a reference</td>
</tr>
<tr>
-<td>14</td>
+<td align="right">14</td>
<td>POPS</td>
<td><code><span class='Value'>x</span> <span class='Gets'>→</span></code></td>
<td></td>
</tr>
<tr>
-<td>15</td>
+<td align="right">15</td>
<td>DFND</td>
<td><code><span class='Gets'>→</span> <span class='Paren'>(</span><span class='Value'>i</span><span class='Function'>⊑</span><span class='Value'>blocks</span><span class='Paren'>)</span></code></td>
<td>Also sets block's parent scope</td>
</tr>
<tr>
-<td>20</td>
+<td align="right">20</td>
<td>OP2H</td>
<td><code><span class='Value'>𝕘</span> <span class='Value'>𝕣</span> <span class='Gets'>→</span> <span class='Paren'>(</span><span class='Modifier2'>_𝕣_</span> <span class='Value'>𝕘</span><span class='Paren'>)</span></code></td>
<td></td>
</tr>
<tr>
-<td>21</td>
+<td align="right">21</td>
<td>LOCO</td>
<td><code><span class='Gets'>→</span> <span class='Value'>x</span></code></td>
<td>Local variable value</td>
</tr>
<tr>
-<td>22</td>
+<td align="right">22</td>
<td>LOCM</td>
<td><code><span class='Gets'>→</span> <span class='Value'>r</span></code></td>
<td>Local variable reference</td>
</tr>
<tr>
-<td>25</td>
+<td align="right">25</td>
<td>RETN</td>
<td><code><span class='Value'>x</span> <span class='Gets'>→</span> <span class='Value'>x</span></code></td>
<td>Returns from current block</td>
@@ -389,114 +389,114 @@
<table>
<thead>
<tr>
-<th>Ind</th>
+<th align="right">Ind</th>
<th>Name</th>
<th>Description / restrictions</th>
</tr>
</thead>
<tbody>
<tr>
-<td>0</td>
+<td align="right">0</td>
<td><code><span class='Function'>IsArray</span></code></td>
<td>1 if the right argument is an array, 0 otherwise</td>
</tr>
<tr>
-<td>1</td>
+<td align="right">1</td>
<td><code><span class='Function'>Type</span></code></td>
<td>The fill value for array <code><span class='Value'>𝕩</span></code></td>
</tr>
<tr>
-<td>2</td>
+<td align="right">2</td>
<td><code><span class='Function'>Log</span></code></td>
<td><code><span class='Function'>⋆</span><span class='Modifier'>⁼</span></code> (natural or base-<code><span class='Value'>𝕨</span></code> logarithm) for atomic arguments</td>
</tr>
<tr>
-<td>3</td>
+<td align="right">3</td>
<td><code><span class='Function'>GroupLen</span></code></td>
<td><code><span class='Function'>≠</span><span class='Modifier'>¨</span><span class='Function'>⊔</span><span class='Value'>𝕩</span></code> for a valid list <code><span class='Value'>𝕩</span></code></td>
</tr>
<tr>
-<td>4</td>
+<td align="right">4</td>
<td><code><span class='Function'>GroupOrd</span></code></td>
<td><code><span class='Function'>∾⊔</span><span class='Value'>𝕩</span></code> provided <code><span class='Value'>𝕨</span></code> is <code><span class='Function'>GroupLen</span> <span class='Value'>𝕩</span></code></td>
</tr>
<tr>
-<td>5</td>
+<td align="right">5</td>
<td><code><span class='Function'>!</span></code></td>
<td></td>
</tr>
<tr>
-<td>6</td>
+<td align="right">6</td>
<td><code><span class='Function'>+</span></code></td>
<td>On two atoms</td>
</tr>
<tr>
-<td>7</td>
+<td align="right">7</td>
<td><code><span class='Function'>-</span></code></td>
<td>On one or two atoms</td>
</tr>
<tr>
-<td>8</td>
+<td align="right">8</td>
<td><code><span class='Function'>×</span></code></td>
<td>On two atoms</td>
</tr>
<tr>
-<td>9</td>
+<td align="right">9</td>
<td><code><span class='Function'>÷</span></code></td>
<td>On one or two atoms</td>
</tr>
<tr>
-<td>10</td>
+<td align="right">10</td>
<td><code><span class='Function'>⋆</span></code></td>
<td>On one or two atoms</td>
</tr>
<tr>
-<td>11</td>
+<td align="right">11</td>
<td><code><span class='Function'>⌊</span></code></td>
<td>On one atom</td>
</tr>
<tr>
-<td>12</td>
+<td align="right">12</td>
<td><code><span class='Function'>=</span></code></td>
<td>On one value or two atoms</td>
</tr>
<tr>
-<td>13</td>
+<td align="right">13</td>
<td><code><span class='Function'>≤</span></code></td>
<td>On two atoms</td>
</tr>
<tr>
-<td>14</td>
+<td align="right">14</td>
<td><code><span class='Function'>≢</span></code></td>
<td>For array <code><span class='Value'>𝕩</span></code></td>
</tr>
<tr>
-<td>15</td>
+<td align="right">15</td>
<td><code><span class='Function'>⥊</span></code></td>
<td>For array <code><span class='Value'>𝕩</span></code> with no <code><span class='Value'>𝕨</span></code> or <code><span class='Value'>𝕨</span><span class='Function'>=</span><span class='Modifier2'>○</span><span class='Paren'>(</span><span class='Function'>×</span><span class='Modifier'>´</span><span class='Paren'>)</span><span class='Function'>≢</span><span class='Value'>𝕩</span></code></td>
</tr>
<tr>
-<td>16</td>
+<td align="right">16</td>
<td><code><span class='Function'>⊑</span></code></td>
<td>For atom <code><span class='Value'>𝕨</span></code> and list <code><span class='Value'>𝕩</span></code></td>
</tr>
<tr>
-<td>17</td>
+<td align="right">17</td>
<td><code><span class='Function'>↕</span></code></td>
<td>For natural number <code><span class='Value'>𝕩</span></code></td>
</tr>
<tr>
-<td>18</td>
+<td align="right">18</td>
<td><code><span class='Modifier'>⌜</span></code></td>
<td>On arrays</td>
</tr>
<tr>
-<td>19</td>
+<td align="right">19</td>
<td><code><span class='Modifier'>`</span></code></td>
<td></td>
</tr>
<tr>
-<td>20</td>
+<td align="right">20</td>
<td><code><span class='Modifier2'>⊘</span></code></td>
<td></td>
</tr>
diff --git a/docs/tutorial/list.html b/docs/tutorial/list.html
index 7895a891..373da09a 100644
--- a/docs/tutorial/list.html
+++ b/docs/tutorial/list.html
@@ -50,22 +50,22 @@
<table>
<thead>
<tr>
-<th>Data</th>
-<th>Operation</th>
+<th align="center">Data</th>
+<th align="center">Operation</th>
</tr>
</thead>
<tbody>
<tr>
-<td>Number</td>
-<td>Function</td>
+<td align="center">Number</td>
+<td align="center">Function</td>
</tr>
<tr>
-<td>Character</td>
-<td>1-modifier</td>
+<td align="center">Character</td>
+<td align="center">1-modifier</td>
</tr>
<tr>
-<td>Array</td>
-<td>2-modifier</td>
+<td align="center">Array</td>
+<td align="center">2-modifier</td>
</tr>
</tbody>
</table>
diff --git a/implementation/vm.md b/implementation/vm.md
index 2e501bf5..a94eadb5 100644
--- a/implementation/vm.md
+++ b/implementation/vm.md
@@ -43,7 +43,7 @@ Because most encoded numbers will be less than 128, for higher performance it's
The following instructions are defined by dzaima/BQN. The ones emitted by the self-hosted BQN compiler are marked in the "used" column.
| B | Name | Used | Like | Args | Description
-|----|------|------|------|----------|------------
+|---:|------|:----:|-----:|:---------|------------
| 0 | PUSH | X | | `I` | Push object `I`
| 1 | VARO | | | `I` | Push named variable `I`
| 2 | VARM | | | `I` | Push named variable `I` reference
@@ -74,7 +74,7 @@ The following instructions are defined by dzaima/BQN. The ones emitted by the se
Stack effects for most instructions are given below. Instructions 16, 17, and 19 are identical to 5, 6, and 10 except that the indicated values in the higher-numbered instructions may be `·`. The lower-numbered instructions are not yet emitted by the self-hosted compiler and can be implemented simply by making them identical to the higher-numbered ones; however, it may be possible to make them faster by not checking for Nothing.
| B | Name | Stack effect | Comments
-|----|------|-----------------------|--------
+|---:|------|-----------------------|--------
| 0 | PUSH | `→ (i⊑consts)` |
| 3 | ARRO | `x0 … xm → ⟨x0 … xm⟩` | `N` total variables (`m=n-1`)
| 5 | FN1C | `𝕩 𝕤 → (𝕊 𝕩)` | 16: `𝕩` may be `·`
@@ -126,7 +126,7 @@ While it's perfectly possible to implement the runtime from scratch, the pseudo-
The contents of a core runtime are given below. The names given are those used in r.bqn; the environment only provides a list of values and therefore doesn't need to use the same names. For named functions a description is given. For primitives, the implementation should match the BQN specification for that primitive on the specified domain, or the entire domain if left empty. They won't be called outside that domain except if there are bugs in r.bqn.
| Ind | Name | Description / restrictions
-|-----|------------|---------------------------
+|----:|------------|---------------------------
| 0 | `IsArray` | 1 if the right argument is an array, 0 otherwise
| 1 | `Type` | The fill value for array `𝕩`
| 2 | `Log` | `⋆⁼` (natural or base-`𝕨` logarithm) for atomic arguments
diff --git a/md.bqn b/md.bqn
index 428992d0..45fdada0 100644
--- a/md.bqn
+++ b/md.bqn
@@ -254,14 +254,17 @@ Markdown ← {filename𝕊𝕩:
r ← b > » '\' = 𝕩 # Non-escaped bars
1 -˜ (¬r∨«b>r) × o + +` r
}
+ alignments ← (" align="""∾∾⟜"""")⍟(0<≠)¨ ""‿"right"‿"left"‿"center"
ProcTable ← {
rows ← (Trim¨ CutTableRow⊸⊔)¨ 𝕩
- inc ← ¬ rule ← ∧´∘∾¨'-'=rows
- rows ↩ ProcInline¨¨⌾(inc⊸/) rows
+ incl ← ¬ rule ← (∧´∾∊"-:"˙)¨ rows
+ align ← alignments ⊏˜ (+˜⊸+´0‿¯1⊏⊢)¨ ':' = ⊑ rule / rows
+ rows ↩ ProcInline¨¨⌾(incl⊸/) rows
rows ↩ (⊏rows) (⊢ ∾ ⟨""⟩ /˜ 0⌈-○≠)¨ rows
- rowType ← inc / +` rule # Head or body
- DoRow ← { lf ∾ JoinLines 𝕨⊸Html¨ 𝕩 }
- rows ↩ (rowType ⊏ "th"‿"td") DoRow¨ inc/rows
+ rowType ← incl / +` rule # Head or body
+ tags ← rowType ⊏ "th"‿"td"
+ DoRow ← { lf ∾ JoinLines 𝕨 Html¨ 𝕩 }
+ rows ↩ (<˘ tags ∾⌜ align) DoRow¨ incl/rows
rowGroups ← ¯1 ↓ rowType ⊔○(∾⟜2) "tr"⊸Html¨ rows
sections ← "thead"‿"tbody" Html⟜(lf ∾ JoinLines)¨ rowGroups
"table" Html lf ∾ JoinLines (0 < ≠¨rowGroups) / sections
diff --git a/tutorial/list.md b/tutorial/list.md
index f97e5d95..015c2326 100644
--- a/tutorial/list.md
+++ b/tutorial/list.md
@@ -53,7 +53,7 @@ A ligature is a kind of notation and doesn't do something specific like a functi
Now that all six BQN types have been introduced, let's make a table:
Data | Operation
-----------|-----------
+:--------:|:---------:
Number | Function
Character | 1-modifier
Array | 2-modifier