BQN: Difference between revisions
(Implementations section, covering dzaima/BQN) |
(→Implementations: Paragraph on Singeli) |
||
Line 27: | Line 27: | ||
BQN has several implementations,<ref name="running"/> with all complete ones based on self-hosted sources, which are compiled to bytecode and included as literal arrays or similar in the implementation's source. [https://github.com/dzaima/CBQN CBQN], developed by [[dzaima]] in [[wikipedia:C (programming language)|C]], is the primary implementation with the best performance. A [[wikipedia:JavaScript|JavaScript]] version can be run online. It's slower than CBQN compiled to [[wikipedia:WebAssembly|Wasm]], but easier to connect with browser functionality. | BQN has several implementations,<ref name="running"/> with all complete ones based on self-hosted sources, which are compiled to bytecode and included as literal arrays or similar in the implementation's source. [https://github.com/dzaima/CBQN CBQN], developed by [[dzaima]] in [[wikipedia:C (programming language)|C]], is the primary implementation with the best performance. A [[wikipedia:JavaScript|JavaScript]] version can be run online. It's slower than CBQN compiled to [[wikipedia:WebAssembly|Wasm]], but easier to connect with browser functionality. | ||
The [https://github.com/mlochbaum/Singeli Singeli] language was developed in order to implement BQN more effectively. CBQN uses Singeli for primitive code that uses [[vector instruction]]s, and can be built with or without these optimized implementations. The Singeli implementation is written in BQN and currently targets C. | |||
=== dzaima/BQN === | === dzaima/BQN === |
Revision as of 01:41, 24 April 2022
BQN is an APL-family language designed primarily by Marshall Lochbaum. Although it maintains the concept of array-driven computing and much of APL's array functionality, BQN discards all compatibility with other array languages and changes many fundamental concepts. It uses the based array model with dedicated array notation, distinguishes between data types and expression roles to give the language a context-free grammar with first-class functions, and uses a new set of glyphs with different primitive pairings. The language uses the leading axis model and tacit programming as core paradigms. Its implementation is largely self-hosted, with an array-based compiler like Co-dfns.
Implementations
BQN has several implementations,[1] with all complete ones based on self-hosted sources, which are compiled to bytecode and included as literal arrays or similar in the implementation's source. CBQN, developed by dzaima in C, is the primary implementation with the best performance. A JavaScript version can be run online. It's slower than CBQN compiled to Wasm, but easier to connect with browser functionality.
The Singeli language was developed in order to implement BQN more effectively. CBQN uses Singeli for primitive code that uses vector instructions, and can be built with or without these optimized implementations. The Singeli implementation is written in BQN and currently targets C.
dzaima/BQN
Now largely replaced by CBQN, dzaima/BQN is dzaima's independent implementation in Java, based on dzaima/APL. While dzaima/APL adds significant new functionality and is different from any other APL, dzaima/BQN follows the BQN specification closely and sometimes extends it with system functions. It has often been the first implementation to support new functionality, particularly syntax such as block headers, and was the fastest implementation before CBQN was created. It introduced the bytecode format now shared with self-hosted BQN, and was used for development and bootstrapping.
Primitives
Functions
Glyph | Monadic | Dyadic |
---|---|---|
+ |
Conjugate | Add |
- |
Negate | Subtract |
× |
Sign | Multiply |
÷ |
Reciprocal | Divide |
⋆ |
Exponential | Power |
√ |
Square Root | Root |
⌊ |
Floor | Minimum |
⌈ |
Ceiling | Maximum |
∧ |
Sort Up | And |
∨ |
Sort Down | Or |
¬ |
Not | Span |
| |
Absolute Value | Modulus |
≤ |
Less Than or Equal to | |
< |
Enclose | Less Than |
> |
Merge | Greater Than |
≥ |
Greater Than or Equal to | |
= |
Rank | Equals |
≠ |
Length | Not Equals |
≡ |
Depth | Match |
≢ |
Shape | Not Match |
⊣ |
Identity | Left |
⊢ |
Identity | Right |
⥊ |
Deshape | Reshape |
∾ |
Join | Join to |
≍ |
Solo | Couple |
↑ |
Prefixes | Take |
↓ |
Suffixes | Drop |
↕ |
Range | Windows |
» |
Nudge | Shift Before |
« |
Nudge Back | Shift After |
⌽ |
Reverse | Rotate |
⍉ |
Transpose | Reorder axes |
/ |
Indices | Replicate |
⍋ |
Grade Up | Bins Up |
⍒ |
Grade Down | Bins Down |
⊏ |
First Cell | Select |
⊑ |
First | Pick |
⊐ |
Classify | Index of |
⊒ |
Occurrence Count | Progressive Index of |
∊ |
Unique Mask | Member of |
⍷ |
Deduplicate | Find |
⊔ |
Group Indices | Group |
Modifiers
1-modifiers in BQN use superscript symbols, while 2-modifiers use symbols with a circle, but not one with a line through it like ⌽
and ⍉
.
|
|
Some modifiers are closely related, and some of their glyphs are intended to allude to this:
- The three 1-modifers Cells (
𝔽˘
), Each (𝔽¨
), and Undo (𝔽⁼
) are equivalent to using a right-operand of¯1
with the 2-modifiers Rank (𝔽⎉¯1
), Depth (𝔽⚇¯1
), and Repeat (𝔽⍟¯1
). Therefore the 2-modifiers are circled versions of the 1-modifiers (except in the case of Undo/Repeat). - Under (
𝔽⌾𝔾
) is in principle equivalent to𝔾⁼∘𝔽○𝔾
. Therefore,⌾
is a combination of the glyphs∘
and○
.
References
APL dialects [edit] | |
---|---|
Maintained | APL+Win ∙ APL2 ∙ APL64 ∙ APL\iv ∙ Aplette ∙ April ∙ Co-dfns ∙ Dyalog APL ∙ Dyalog APL Vision ∙ dzaima/APL ∙ GNU APL ∙ Kap ∙ NARS2000 ∙ Pometo ∙ TinyAPL |
Historical | A Programming Language ∙ A+ (A) ∙ APL# ∙ APL2C ∙ APL\360 ∙ APL/700 ∙ APL\1130 ∙ APL\3000 ∙ APL.68000 ∙ APL*PLUS ∙ APL.jl ∙ APL.SV ∙ APLX ∙ Extended Dyalog APL ∙ Iverson notation ∙ IVSYS/7090 ∙ NARS ∙ ngn/apl ∙ openAPL ∙ Operators and Functions ∙ PAT ∙ Rowan ∙ SAX ∙ SHARP APL ∙ Rationalized APL ∙ VisualAPL (APLNext) ∙ VS APL ∙ York APL |
Derivatives | AHPL ∙ BQN ∙ CoSy ∙ ELI ∙ Glee ∙ I ∙ Ivy ∙ J ∙ Jelly ∙ K (Goal, Klong, Q) ∙ KamilaLisp ∙ Lang5 ∙ Lil ∙ Nial ∙ RAD ∙ Uiua |
Overviews | Comparison of APL dialects ∙ Timeline of array languages ∙ Timeline of influential array languages ∙ Family tree of array languages |