*View this file with results and syntax highlighting [here](https://mlochbaum.github.io/BQN/doc/fromDyalog.html).*
# BQNβDyalog APL dictionary
A few tables to help users of Dyalog APL (or similar) get started quickly on BQN. For a higher-level comparison, check [Why BQN?](../commentary/why.md#versus-apl-and-j). Here we assume `βML` is 1 for Dyalog.
## Terminology
### Array model
BQN uses the [based array model](based.md), so that a Dyalog simple scalar corresponds to many BQN values: an atom, its enclose, and so on.
| Dyalog | BQN |
|---------------|-------|
| Simple scalar | Atom |
| Scalar | Unit |
| Vector | List |
| Matrix | Table |
BQN shares the terms "[cell](array.md#cells)" and "major cell" with Dyalog, and uses "element" (which may mean different things to different Dyalog users) *not* for a 0-cell but for the value it contains.
### Roles
Dyalog uses value types (array, function, and so on) to determine syntax while BQN uses a separate concept called syntactic roles. See [context-free grammar](context.md).
| Dyalog type | BQN role |
|------------------|------------|
| Array | Subject |
| Function | Function |
| Monadic operator | 1-modifier |
| Dyadic operator | 2-modifier |
| Niladic function | *go away* |
## Syntax
BQN comments are written with `#`, not `β`. BQN strings use double quotes `""` while single quotes `''` enclose a character.
BQN's [block](block.md) functions use `{}`, like Dyalog's dfns. The names for inputs and self-reference are different:
| Dyalog | BQN |
|--------|-----|
| `βΊ` | `π¨` |
| `β΅` | `π©` |
| `β` | `π` |
| `βΊβΊ` | `π½` |
| `β΅β΅` | `πΎ` |
| `ββ` | `π£` |
Blocks don't have guards exactly, but headers and predicates support some similar functionality (first-class functions can also be used for [control structures](control.md)). Headers can also be used to make a block more explicit about its inputs, more like a tradfn.
The assignment arrow `β` defines a new variable in a block, while `β©` modifies an existing one.
BQN uses the ligature character `βΏ` for stranding, instead of plain juxtaposition. It also has a [list notation](arrayrepr.md#brackets) using `β¨β©`, and `[]` for higher-rank arrays.
## For reading
Glyphs `+-ΓΓ·ββ|β£β’β` have nearly the same meaning in BQN as APL. The other primitive functions (except `!`, Assert) are translated loosely to Dyalog APL below.
| BQN | Monad | Dyad
|-----|---------------|-----
| `β` | `*` | `*`
| `β` | `*β(Γ·2)` | `*βΓ·β¨`
| `β§` | `{β΅[ββ΅]}` | `β§`
| `β¨` | `{β΅[ββ΅]}` | `β¨`
| `Β¬` | `~` | `1+-`
| `=` | `β’β€β΄` | `=`
| `β ` | `β’` | `β `
| `<` | `β` | `<`
| `>` | `β` | `>`
| `β’` | `β΄` | `β’`
| `β₯` | `,` | `β΄`
| `βΎ` | `β,βΏ` | `βͺ`
| `β` | `β,β₯β` | `β,β₯β`
| `β` | `,β₯β` | `,β₯β`
| `β` | `,β` | `β`
| `β` | `{β½,β¨ββ½β΅}` | `β`
| `β` | `β³` | `,βΏ`
| `Β»` | ` β’β(Β―1-β’)ββ’` | ` β’β€β’ββͺ`
| `Β«` | `-β€β’β(1+β’)ββ’` | `-β€β’β€β’ββͺβ¨`
| `β½` | `β` | `β`
| `/` | `βΈ` | `βΏ`
| `β` | `β` | `βΈ`
| `β` | `β` | `βΈ`, reversed order
| `β` | `β£βΏ` | `β·`
| `β` | `β` | `β`
| `β` | `βͺβ³β’` | `β³`
| `β` | `+βΏβ.β‘β¨β§β.<β¨β(β³β’)` | `{Rββ’β€β’β΄βββββΊβ³βͺβ¨ββΊ(Rβ¨β³R)β΅}`
| `β` | `β ` | `β`
| `β·` | `βͺ` | `β·`
| `β` | `{ββ΅}βΈ` | `{ββ΅}βΈ` 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 | `Β¨` | `β.` | `βΏ` | `β` | `β€A` | `β£` | `β¨` | `β€f` | `β₯` | `β` |
Some other BQN modifiers have been proposed as future Dyalog extensions:
| BQN | `βΎ` | `β` | `βΈ` |
|:---------------:|:---:|:---:|:---:|
| Dyalog proposed | `β’` [Under](https://aplwiki.com/wiki/Under) | `β₯` [Depth](https://aplwiki.com/wiki/Depth_(operator)) | `β` [Reverse Compose](https://aplwiki.com/wiki/Reverse_Compose)
## For writing
The tables below give approximate implementations of Dyalog primitives for the ones that aren't the same. First- and last-axis pairs are also mostly omitted. BQN just has the first-axis form, and you can get the last-axis form with `β1`.
The form `Fβ£G` (Power with a function right operand; Power limit) must be implemented with recursion instead of primitives because it performs unbounded iteration. The modifier `_while_ β {π½βπΎβπ½_π£_πΎβπ½βπΎπ©}` provides similar functionality without risk of stack overflow. It's discussed [here](control.md#low-stack-version) and called as `Fn _while_ Cond arg`.
| Functions |
| Glyph | Monadic | Dyadic |
* | β |
β | ββΌ |
! | ΓΒ΄1+β | (-Γ·β(ΓΒ΄)1βΈ+)ββΛ |
β | ΟβΈΓ | β’math |
~ | Β¬ | Β¬ββ/β£ |
? | β’rand.Rangeβ0 | β’rand.Deal |
β² | | Β¬ββ§ |
β± | | Β¬ββ¨ |
β΄ | β’ | β₯ |
, | β₯ | βΎβ1 |
βͺ | β₯Λ | βΎ |
β½ | β½β0βΏ1 |
β | > | β |
β | <Λ | β |
β | < | +`βΈβ |
β | <β(1β₯β‘) | (Β¬-Λβ’ΓΒ·+`Β»βΈ>)βΈβ |
β | {(βΎπΒ¨)β(1<β‘)β₯π©} | β |
β | β |
βΏ | | / |
β | | {π©βΎ(π¨βΈ/)π¨β βΈβ0βπ©} |
β© | | β/β£ |
βͺ | β· | β£βΎβΛΒ¬βΈ/β’ |
β³ | β | β |
βΈ | / | β |
β | β | ββ |
β | β | ββ |
β’ | β | β’ |
β | β’BQN |
β | β’Fmt |
β₯ | | {+β(π¨βΈΓ)Β΄β½π©} |
β€ | | {π¨|>ββΓ·`βΎβ½π¨Β«Λ<π©} |
βΉ | Inverse, | Solve from here |
β· | N/A | β |
| Operators |
| Syntax | Monadic | Dyadic |
βΏ | Β¨Λ | β |
β | β, or ` if associative |
Β¨ | Β¨ |
β¨ | Λ |
β£ | β |
f.g | | fΛβgβ1βΏβ |
β.f | | fβ |
Aβg | AβΈg | |
fβB | fβB | |
fβg | fβg |
fβ€B | fβB |
fβ€g | fβg |
fβ₯g | fβg |
f@v | fβΎ(vβΈβ) |
fβ B | Uh |
fβΈ | βββββ | ββΈβ |
fβΊB | β |
AβΆ | β’Something |
f& | Nothing yet |