BQN is in an early stage of development, and no implementation is complete yet. However, it's a relatively simple language to implement, and a few implementations come close. At the moment, dzaima/BQN is the most usable version, with good performance and error reporting.
This repository contains a BQN implementation written mainly in BQN: the bytecode compiler is completely self-hosted, and the majority of the runtime is written in BQN except that it is allowed to define primitives; some preprocessing turns the primitives into identifiers. The remaining part, a VM, can be implemented in any language to obtain a version of BQN running in that language. A Javascript implementation allows BQN to be run as a client-side REPL or in Node.js as a library.
The bytecode is also the same as dzaima/BQN's format, and an extension to the compiler adjusts the slightly different block declarations to target dzaima+reference BQN. There is also an earlier experiment targetting WebAssembly that works only on a very small subset of BQN.
This version is not yet suitable for serious programming. The runtime has full error checking but the compiler does not, so syntax errors can go unreported. It does not yet support function headers or multiple bodies. The Javascript-based compiler is also slow, taking about 0.05 seconds plus 1 second per kilobyte of source (this is purely due to the slow runtime, as dzaima+reference achieves 1ms/kB with the same compiler once warmed up).
All versions have automated tests in the test directory, with the self-hosted version (test/js) and WebAssembly backend (test/dz_wasm.js) tested with Javascript using Node and the dzaima/BQN backend tested with BQN itself (test/dz_comp).
dzaima/BQN is an implementation in Java created by modifying the existing dzaima/APL. It should be easy to run on desktop Linux and Android. It is still in development and has almost complete syntax support but incomplete primitive support.
This repository contains a dzaima/BQN script dzref that fills in the gaps in primitive support using BQN implementations of primitives that are not yet up to spec (reference implementations of all primitives starting from a small set of pre-existing functions are part of BQN's specification).
You can run dzref from ordinary dzaima/BQN using the •EX command; see for example wcshim.bqn. For testing, it is run as a Unix script, in which case it depends on an executable dbqn that runs dzaima/BQN on a file argument. I use the following script, using the path to a clone of dzaima/BQN for the jar file.
#! /bin/bash java -jar /path/to/dzaima/BQN/BQN.jar -f "$@"
The left argument for •EX or the shell arguments can contain up to two arguments for the script. The first is a file to run, and the second is BQN code to be run after it.
BQN2NGN is a prototype implementation in Javascript build to experiment with the langauge, which is now abandoned. It can be used online here. Major differences are that it has no Fold and Insert is spelled ´ even though current BQN uses ˝, that it has a different version of Group (⊔), and that it is missing Choose (◶). There are also some spelling differences, with Deduplicate (⍷) spelled with ∪ and Valences (⊘) spelled with ⍠. It is missing value blocks and function headers.