View this file with results and syntax highlighting here.
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?. Here we assume βML is 1 for Dyalog.
Terminology
Array model
BQN uses the based array model, 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" 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.
| 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 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). 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 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 |
β₯ Depth |
β 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 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 | |
