Skip to main content

bAsedPL

bAsedPL (“Based-array APL”) is an APL-derived array language, borrowing ideas from J and BQN, with an emphasis on simple, consistent notation. It is implemented in Rust, with a native executable, Jupyter kernel and Python API.

For APL users, the main choices are:

  • Based arrays, as in BQN: numbers, characters and functions are atoms; enclosure always adds a layer.
  • Brackets write vectors, and spaces group: [a b c] is a vector, and a+b × c+d is (a+b)×(c+d). Parentheses round a literal make a scalar: (1 2) is ⊂1 2. A run that ends in a function is a train, so +/÷≢ x is the mean of x, and 2× binds 2. An array next to an argument selects from it: v 0 is the first item.
  • Leading-axis broadcasting, including expansion of length-1 axes, plus string keys and names on axes.
  • Exact integers and rationals alongside approximate real and complex numbers.
  • Dfns, trains and operators, with additions such as Under, iteration histories, windows and function arrays.

Positions and axes count from 0, as in BQN and Python. Approximate comparisons use tolerance 1E¯14. See the language principles for why bAsedPL works this way, the glyph reference for Dyalog differences and the language rules for the array model.

Install and try it

pip install basedpl
bapl

At the prompt, define a mean and apply it:

avg←+/÷≢
avg 2 4 9
5

Use bapl -e 'avg←+/÷≢ ⋄ avg 2 4 9' for a shell command. The command-line guide covers source files and pipes.

Interactive use

In the REPL, type a backtick followed by a glyph name: `iota becomes ⍳ when you press Tab or type a non-letter. Abbreviations and Alt-key shortcuts are available. ]help + shows help; ]box on -style=max -trains=tree -fns=on enables boxed arrays and function trees. See REPL and the glyph reference, which lists each glyph’s key.

In Jupyter, select the installed bAsedPL kernel. Cells share definitions and support completion, Shift-Tab help and interruption. You can also use %%apl cells in a Python notebook. See Using bAsedPL notebooks.

New to APL?

APL is a language built around operations on whole arrays and notation for combining functions. Here is a taste of that style in bAsedPL.

Numbers separated by spaces form a vector. Arithmetic applies to every element:

10+1 2 3
11 12 13

Operators modify or combine functions. Reduce (/) turns addition into summation. ⍳10 generates 0…9:

+/⍳10
45

Functions can also be combined without naming their arguments. In avg←+/÷≢, sum (+/) divided by tally (≢) defines the mean:

avg 1 2 3 4
2.5

To see how these ideas express an algorithm, start from “a prime has exactly two positive divisors”. Form all remainders of 1 to 50 (|⊗⍨1+⍳50), count the zeros down each column (+⌿0=), and find the positions (⍸) whose count is two. Positions count from 0, so 1+ turns them back into numbers:

1+⍸2=+⌿0=|⊗⍨1+⍳50
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

Getting started builds this expression step by step, displaying the divisibility matrix along the way.

What’s distinctive?

Numbers

Bare numbers are approximate. Use x for exact integers and r for exact fractions:

1r3+1r6
1r2

Complex numbers use j between real and imaginary parts. Functions such as square root extend into the complex domain:

√¯4
0j2

See numbers for conversion and mixed arithmetic.

Array literals and broadcasting

Write matrix rows directly in an array literal. Leading-axis agreement lets a vector supply one offset per row:

m←[1 2 3 ⋄ 4 5 6]
m+10 20
11 12 13
24 25 26

See array notation and broadcasting.

Keys and named axes

Axes can have names, and positions along them can have string keys. Describe the axes once, then select by key or reduce by axis name:

axes←["city":["NY" "LA"] "month":["Jan" "Feb" "Mar"]]
sales←axes:[10 20 30 ⋄ 40 50 60]
"LA" "Feb"⌷sales
+/⍠"month" sales
50

["city":2]⍴["NY":60 "LA":150]

Keys and names travel with axes through operations such as transpose. Arithmetic aligns matching names and keys. See Axis keys.

Function operators

A vector of counts keeps the history: one state for each count, where count 0 is the initial value. Here, double up to four times:

2×⍣(⍳5) 1
1 2 4 8 16

Under (⌾) transforms the argument, applies a function, then reverses the transformation. Scale by ten, floor, and scale back to round down to tenths:

⌊⌾(10×)1.25 2.78
1.2 2.7

Explore iteration and inverses, Under, windows and function selection.

Mathematical tools

Primes and factorisation are built in:

⨸360x
[2 2 2 3 3 5]ₓ

Polynomials support coefficients, roots and evaluation. Polynomial functions can be differentiated: for f(x) = 1 + 2x + 3x², f′(2) = 14.

f←1x 2x 3x⌻ ⋄ f∂2x
14ₓ

Probability distributions provide sampling, density, CDF and quantiles. Two fair coin tosses give these probabilities for 0, 1 and 2 heads:

coin←•binomial 2 0.5
coin.density 0 1 2
0.25 0.5 0.25

Matrix division handles linear systems and least squares.

Data and text

JSON objects become keyed arrays, with dot access to their fields:

order←•json "{""price"":10.5,""qty"":2}"
order.price×order.qty
21

CSV headers likewise name column vectors. Files, CSV and JSON covers reading, transforming and writing data. Regex supplies matching, captures and replacement through Rust’s regex engine.

Drawing

•plot draws charts from arrays. Keys label the axes and name the lines. See Plots.

["legend":"end"]•plot sales

Build SVG from element functions and keyed attributes. Notebooks display the picture directly. The same element trees serialize to XML. See XML and SVG.

circle←•element "circle"
text←•element "text"
c←["cx":50 "cy":40 "r":25 "fill":"orange"]circle ""
t←["x":50 "y":85 "text-anchor":"middle"]text "Hello, SVG"
["width":240 "height":240]•svg [c t]

Python

APL functions are Python callables:

from basedpl import fn

mean = fn('+/÷≢')
mean([1, 2, 3])

Arrays have .py, .np and .df conversions for Python values, NumPy and pandas. Functions also have Python names and composition operators. See the Python tutorial.

For other frontends, the process interfaces provide JSON messages and interruptible workers. The APL library contains more algorithms, codecs, interpreters and puzzles.

Install from source

Requires Python ≥3.10 and Rust ≥1.98. In your Python environment:

git clone https://github.com/AnswerDotAI/basedpl.git
cd basedpl
pip install .

For a standalone executable without Python, run cargo install --path .. Cargo installs it in its bin directory, normally ~/.cargo/bin. Put that directory on your PATH.

Contributing

Install the development and documentation tools with pip install -e '.[dev]'. The main commands are:

cargo test
cargo run -- -e '2×3+4'
cargo fastfmt
maturin develop
pytest -q
ship-rs-build

Rebuild with maturin develop after Rust changes, before checking the installed extension. Cargo tests alone don’t update the editable Python installation. Use cargo fastfmt, not cargo fmt.

Before a release, run python scripts/prep.py from the repository root. It checks the glyph reference against the interpreter’s glyph table, writes the syntax highlighters’ glyph lists, cleans and exports the notebooks, and renders this README.

Use lowercase j in complex literals throughout tests and examples, including adapted reference cases. Reserve uppercase J for explicit input-alias tests. Keep archived upstream source unchanged.

Write literal matrices in array notation, [10 20 30 ⋄ 40 50 60], not as a reshape, 2 3⍴10 20 30 40 50 60. Keep ⍴ where the example is about reshape.

Brackets are the usual way to write a list. A bare literal list, such as 1 2 3, is a shorthand. End an operand with a space, not with parentheses or ⊢. Where a literal operand would run into a literal argument, write brackets instead, as in f⍤1 [2 3]. Report any case where neither a space nor brackets works.

Metadata

Release files for basedpl 0.1.14

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for basedpl 0.1.14
File Size Uploaded
basedpl-0.1.14.tar.gz 1.7 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for basedpl 0.1.14
File
basedpl-0.1.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
basedpl-0.1.14-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
basedpl-0.1.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
basedpl-0.1.14-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
basedpl-0.1.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details
basedpl-0.1.14-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
basedpl-0.1.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64 Details
basedpl-0.1.14-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 38.3 MB

Release files / basedpl-0.1.14.tar.gz

Download URL basedpl-0.1.14.tar.gz
Size 1.7 MB
Tags Source
SHA-256 checksum
How to use checksums
def00b079a78f687e65d88669335bf6ad3d0e7f967f37b5817a7987349c76490
BLAKE2b-256 checksum
How to use checksums
7d09abf1c040fd6be7602c566bfda0e918bef193990ab46fa8911f47111d55df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / basedpl-0.1.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL basedpl-0.1.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
44ecb56862819a6296dfef98d2d558ffa9716d858b7a4b8a9ea60e7621e825e7
BLAKE2b-256 checksum
How to use checksums
e8a0b61517850f186443884778c0c0f889de387f80e08873c4c1669a5762f6c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / basedpl-0.1.14-cp313-cp313-macosx_11_0_arm64.whl

Download URL basedpl-0.1.14-cp313-cp313-macosx_11_0_arm64.whl
Size 4.1 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9b57093a1fe5f817ae60610de4ef924fc015b534d22df6b7dcf06577d95188de
BLAKE2b-256 checksum
How to use checksums
63c89e4733df2858688aaf2965d1d9d1c488e7b896916104953f2b8804c48257
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / basedpl-0.1.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL basedpl-0.1.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
fc06d6e38cb03d2b86b1c50ef9b818932bcc839b9958b1719494d43dff6c6eb4
BLAKE2b-256 checksum
How to use checksums
55760a767ad51203fad802744f431ca4ec59c99ed4f0e2f4e0d5b19ced2074be
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / basedpl-0.1.14-cp312-cp312-macosx_11_0_arm64.whl

Download URL basedpl-0.1.14-cp312-cp312-macosx_11_0_arm64.whl
Size 4.1 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
da1fa450bbfad1d5e347fe26620286266276b5d7595d9c0598883ae9b4418d96
BLAKE2b-256 checksum
How to use checksums
9b724f8df69fcc2e0d6d0b91e50d8aff9f3a8b6c1a9151df42ae8b1af3f5f095
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / basedpl-0.1.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL basedpl-0.1.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
5ead5662fcffe9b40762554119180a5a413fb7a8ad5a83946b6d3b8ee32d76ce
BLAKE2b-256 checksum
How to use checksums
78fefd8c72a540577b3d8ffeadfeaf25931085b820af744ffe17e42ed632a59a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / basedpl-0.1.14-cp311-cp311-macosx_11_0_arm64.whl

Download URL basedpl-0.1.14-cp311-cp311-macosx_11_0_arm64.whl
Size 4.1 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5572cf7ac97354edfb2001726612ae655bc44fb38dac20d3ff3e199e274aec66
BLAKE2b-256 checksum
How to use checksums
5caa250934bd5059334d4070363d4aa2bb4b4b1a0b2fad141f12cac1ee3d021a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / basedpl-0.1.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL basedpl-0.1.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
c77aa869270c76e1db8351249088065d41dc7f49aa4fc091d6e70af10055d194
BLAKE2b-256 checksum
How to use checksums
b19a11c107961833e6fdf214c9da15da578281ed04557cad2d09471be19acb62
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / basedpl-0.1.14-cp310-cp310-macosx_11_0_arm64.whl

Download URL basedpl-0.1.14-cp310-cp310-macosx_11_0_arm64.whl
Size 4.1 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d1cdc51a92f1c3e4bb6ff811c44387bbd6bfa6fcd8de528c251973290a6c6125
BLAKE2b-256 checksum
How to use checksums
6f9bcb0ae7c55ae5e70719206587abf762e4c7eac263018b04a1d25ae556161e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page