Skip to main content

Mini APL in Python Language Experiment. Uses numpy arrays.

Project description

MARPLE

MARPLE is an experimental APL interpreter that runs on Linux. It already has enough features to be usable, though may more are planned.

It was inspired by Rodrigo Girão Serrão's RGSPL and Iverson's Dictionary of APL. It has taken some additional features from Dyalog APL(TM).

Marple is written in Python and uses numpy for array operations.

I designed the interpreter and directed its development, but all the code, all the tests and almost all of the documentation have been generated by Claude code. So far the development has taken 8 days.

Project status (April 2026): MARPLE is in the middle of a substantial internal cleanup. The scalar storage convention was migrated to align numpy data shape with APL shape, and the post-char-migration primitive sweep — decode (), encode (), monadic and dyadic transpose () — has just been completed, along with several missing pieces (zilde , commute ). Ongoing work includes other missing operators (, @, , ) and test file reorganisation. See plan/post-scalar-cleanup.md for the open TODO list and the latest plan/progress-*.md file for recent activity. Expect the API surface to be stable but the internals to keep moving for a while yet.

While MARPLE has extensive automated tests, it is not and will never be a commercial strength APL. If that's what you want, get Dyalog APL. Dyalog APL is free for non-commercial work

See the full feature list, architecture, and documentation.

Platform support

MARPLE is developed and tested on Linux. It does not currently run on Windows or Mac.

Quick start

Install uv if you don't have it, then:

git clone https://github.com/romilly/marple.git
cd marple
uv venv
source venv/bin/activate
uv pip install -r requirements.txt
marple
MARPLE v0.6.17 - Mini APL in Python
CLEAR WS

      ⍳5
1 2 3 4 5
      +/⍳100
5050
      fact←{⍺←1 ⋄ ⍵=0:⍺ ⋄ (⍺×⍵)∇ ⍵-1}
      fact 20
2432902008176640000

PRIDE Web IDE

From within the virtual environment:

marple-server                     # default: http://0.0.0.0:8888/ (LAN-accessible)
marple-server --port 9000
marple-server --host 127.0.0.1    # localhost only

The startup banner prints both a localhost: URL and a LAN URL using the machine's hostname. Open either in a browser.

PRIDE features

  • a clickable language bar for APL glyph input
  • workspace panel,
  • session with system commands,
  • session save/load, and
  • interactive ⎕/⍞ input.

Running PRIDE on one machine, browsing from another

MARPLE's web server binds to all network interfaces by default, so you can run the interpreter on a Raspberry Pi (or any other machine on your home network) and connect from your desktop browser:

# On the Pi:
marple-server

# On your workstation, in a browser:
http://pi.local:8888/
# …or whatever the Pi's hostname or IP is

This is the simplest way to develop MARPLE on a Pi from a workstation, and it lets you use MARPLE from Windows or Mac machines that don't have the Python environment installed locally.

Security note: the server has no authentication. Only run it on networks where you trust every device — a home LAN is fine, a coffee-shop WiFi is not. For anything beyond a trusted LAN, put PRIDE behind an authenticating reverse proxy (Caddy, nginx + basic auth, Tailscale, etc.).

Jupyter Notebook

uv pip install marple-lang[jupyter]
marple-jupyter-install
jupyter notebook

Select MARPLE (APL) as the kernel.

Running scripts

marple examples/01_primitives.marple

See the demo videos, a demo of Bob Smith's partition functions, )load part_fns, and Conway's Game of Life example.

APL character input

Dyalog keyboard layout (recommended)

On Linux with an extended keyboard (with a Windows/Super key), run:

./scripts/aplkeys.sh

This configures the Dyalog APL keyboard layout using setxkbmap. Hold the Windows key (Super) to type APL glyphs; hold Shift+Windows for the extended set. Each key has up to four meanings:

┌────────┐
│~ ⌺     │  top-left: Shifted        top-right: Shift+Win
│` ⋄     │  bottom-left: Unshifted   bottom-right: Win
└────────┘

Full US layout (see Dyalog keyboard reference for other layouts):

┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐
│~ ⌺ │! ⌶ │@ ⍫ │# ⍒ │$ ⍋ │% ⌽ │^ ⍉ │& ⊖ │* ⍟ │( ⍱ │) ⍲ │_ ! │+ ⌹ │Backspace│
│` ⋄ │1 ¨ │2 ¯ │3 < │4 ≤ │5 = │6 ≥ │7 > │8 ≠ │9 ∨ │0 ∧ │- × │= ÷ │         │
├────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬──────┤
│Tab    │Q   │W   │E ⍷ │R   │T ⍨ │Y   │U   │I ⍸ │O ⍥ │P ⍣ │{ ⍞ │} ⍬ │| ⊣   │
│       │q ? │w ⍵ │e ∊ │r ⍴ │t ~ │y ↑ │u ↓ │i ⍳ │o ○ │p * │[ ← │] → │\ ⊢   │
├───────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴──────┤
│Caps    │A   │S   │D   │F ⍛ │G   │H   │J ⍤ │K ⌸ │L ⌷ │: ≡ │" ≢ │Enter     │
│Lock    │a ⍺ │s ⌈ │d ⌊ │f _ │g ∇ │h ∆ │j ∘ │k ' │l ⎕ │; ⍎ │' ⍕ │          │
├────────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──────────┤
│Shift      │Z ⊆ │X   │C   │V   │B   │N   │M   │< ⍪ │> ⍙ │? ⍠ │Shift       │
│           │z ⊂ │x ⊃ │c ∩ │v ∪ │b ⊥ │n ⊤ │m | │, ⍝ │. ⍀ │/ ⌿ │            │
├───────┬─────┬──────┬──────────────────────────┬──────┬──────┬─────┬──────┤
│Ctrl   │Win  │Alt   │        Space bar         │Alt Gr│Win   │Menu │Ctrl  │
└───────┴─────┴──────┴──────────────────────────┴──────┴──────┴─────┴──────┘

PRIDE language bar

In the PRIDE web IDE, you can click glyphs in the language bar at the top of the screen. No keyboard setup required.

System commands

Command Action
)off Exit
)clear Clear workspace
)wsid [name] Show or set workspace ID
)save [name] Save workspace
)load name Load workspace
)lib List saved workspaces
)drop name Delete a saved workspace
)fns [ns] List defined functions
)ops [ns] List defined operators
)vars List defined variables

Development

uv pip install -r requirements-test.txt
pytest                # fast tests (~1.2s)
pytest -m slow        # PRIDE, WebSocket, deep TCO, ⎕DL tests
pyright src/

References

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

marple_lang-0.8.70.tar.gz (96.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

marple_lang-0.8.70-py2.py3-none-any.whl (104.1 kB view details)

Uploaded Python 2Python 3

File details

Details for the file marple_lang-0.8.70.tar.gz.

File metadata

  • Download URL: marple_lang-0.8.70.tar.gz
  • Upload date:
  • Size: 96.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for marple_lang-0.8.70.tar.gz
Algorithm Hash digest
SHA256 fb3756fc5385110b72c4a63d708a54c1c92417f4c3542936c9cef33019b492fd
MD5 b1684f80ace4c181f9f7963be6a712c0
BLAKE2b-256 990f8ad22933ae81b05ede9018fee7ce077a954d3e2a93c097156fcb87ad2179

See more details on using hashes here.

File details

Details for the file marple_lang-0.8.70-py2.py3-none-any.whl.

File metadata

  • Download URL: marple_lang-0.8.70-py2.py3-none-any.whl
  • Upload date:
  • Size: 104.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for marple_lang-0.8.70-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 604f22e74ab21fc8391bbd7004476ebaa8a34343ef5de8e88e9debe18173fdfb
MD5 c2a9558fa611c89d9ecc1ce8a4573fde
BLAKE2b-256 950c2d513b3ff9d4ff7e113fbcab18bde15ff7aa816897b3aa98cbe950703ce6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page