Jupyter kernel for interactive PLAN evaluation.
Project description
plan-kernel
A Jupyter kernel for the PLAN virtual machine. Type Plan Asm in a cell, see the reduced PLAN value back.
plan-kernel is intended for tutorial use: learning what PLAN's three opcodes (Pin / Law / Elim) do, exercising BPLAN's named primitives, and walking through small programs (Church booleans, factorial, Y-combinator) one reduction at a time.
Status
Alpha. All nine phases of PLAN.md are complete: vendored
runtime, Plan Asm parser, macro expander, cell-level evaluator,
structural renderer, cell magics, BPLAN op prelude, Jupyter kernel +
CLI, and a starter set of teaching fixtures + tour notebook. A fresh
notebook can evaluate (Add 2 3) in cell 1.
PyPI publication is the next step.
Install
From PyPI (once published)
pip install plan-kernel
python -m plan_kernel install # registers the kernelspec with Jupyter
jupyter notebook # "PLAN" appears in the kernel picker
plan-kernel is the PyPI package; plan_kernel is the import name. The same
package supplies both the Python library and the Jupyter kernel — there is
no separate plan-kernel-kernel distribution.
From a clone (local development)
If you've cloned this repo (the typical case while plan-kernel is pre-1.0), do an editable install so changes to the source tree take effect without re-installing:
git clone git@github.com:sigilante/marduk.git
cd marduk/packages/plan-kernel
python -m venv .venv && source .venv/bin/activate # optional but recommended
pip install -e '.[dev]' # installs ipykernel + pytest
pytest # confirm the runtime smoke test passes
To register the kernel with Jupyter so it appears in the notebook kernel picker:
python -m plan_kernel install # user-level install (writes to ~/.local/share/jupyter/kernels/plan-kernel/)
# or
python -m plan_kernel install --prefix .venv # install only inside the active virtualenv
Verify the registration:
jupyter kernelspec list # "plan-kernel" should appear
Launch:
jupyter notebook # or: jupyter lab
In a new notebook, choose "PLAN" from the kernel picker. A
fresh notebook has the BPLAN op prelude pre-bound, so (Add 2 3) evaluates
to 5 in cell 1.
Uninstall
jupyter kernelspec remove plan-kernel # remove kernelspec only
pip uninstall plan-kernel # remove the package
Quickstart
A cell is a sequence of Plan Asm forms. The result of the last non-bind
form displays; bind-only cells render bind <name> summary lines.
(Add 2 3)
5
Define a law and apply it:
(#bind id
(#pin
(#law "id" (id x)
x)))
(id 42)
42
The K combinator and a use:
(#bind k
(#pin
(#law "k" (k a b)
a)))
(k 7 99)
7
The fixtures in tests/fixtures/ cover identity,
K, S, arithmetic, Elim on a nat, and Church booleans — copy any of
them into a cell to see them run.
What's a cell?
A cell is a sequence of Plan Asm forms — the same syntax accepted by the
canonical Reaver parser
(vendor/reaver/src/hs/PlanAssembler.hs),
minus #macro, #export, and @include (those need module-loading semantics
that don't make sense in a notebook).
Supported macros: #pin, #law, #app, #bind. The BPLAN op prelude
auto-loads on kernel start, so (Add 2 3) works in cell 1.
Magic reference
Magics live on lines that start with %, at the very top of the cell.
Comments and blank lines above them stop magic parsing — magics must
lead the cell body.
| Magic | Scope | Effect |
|---|---|---|
%backend evaluate |
this cell | Use the formal Python evaluator (default). |
%backend bevaluate |
this cell | Use the jet-aware evaluator. Faster for arithmetic-heavy programs. |
%reset |
persistent | Drop all user bindings. The BPLAN op prelude is reloaded. |
%env |
read-only | Display user bindings (sorted, comma-separated). Prelude names are filtered out. |
%backend reverts at end-of-cell. %reset is permanent until the next
%reset. %env's output prepends to the cell's value text when the
cell also has a body.
Troubleshooting
No module named 'plan_kernel' when launching the kernel. The kernel.json's
argv uses the Python interpreter that ran plan-kernel install. Reinstall
from the active venv: pip install -e '.[dev]' and python -m plan_kernel install.
plan-kernel not in the kernel picker. Confirm the install:
jupyter kernelspec list should show a plan-kernel row. If --prefix .venv
was used, only that venv's Jupyter sees it; install without --prefix
for a user-wide registration.
unbound: <name> for a name that's clearly defined. Macro expansion
runs before the body's evaluation, so a bind form (#bind name expr)
must appear before any reference to name in cell-execution order.
Within a cell, this is the form order; across cells, the binding from
cell N is in scope for cell N+1.
Recursive laws hit RecursionError. plan-kernel bumps Python's recursion
limit to 200K during evaluation — past that, the BPLAN harness's own
depth guard fires. Most tutorial-scale recursion is fine; deep
factorials or Y-combinator-driven loops may exhaust it.
%env shows nothing. It filters the BPLAN op prelude. Pass
prelude=False when constructing PlanKernelEvaluator programmatically to
see all names, or just rely on the filtered view in the kernel.
Naming
This package was originally called Marduk. As the runtime portion grew
into a generally useful artifact in its own right, it took the name; the
kernel was renamed plan-kernel and the runtime now lives at
packages/marduk/ in this monorepo. See
PLAN_KERNEL.md for design notes.
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file plan_kernel-0.1.2.tar.gz.
File metadata
- Download URL: plan_kernel-0.1.2.tar.gz
- Upload date:
- Size: 34.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c963e3f0550da4178e2e7b70bff845edf10e8507b3ae45cf06ceabe5dbb322b0
|
|
| MD5 |
c2be97153e8b4ef5429c587fc32e68dd
|
|
| BLAKE2b-256 |
dce0af332c93f4cc89cbad58f9ae126c10a504c4ba1ae615f9bd8add03b23096
|
File details
Details for the file plan_kernel-0.1.2-py3-none-any.whl.
File metadata
- Download URL: plan_kernel-0.1.2-py3-none-any.whl
- Upload date:
- Size: 21.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fe71256af1d77a7209b2b289965a22f5c7b55af7e4605d7a6673c1ea14301ea
|
|
| MD5 |
5f29e856af3cc294664cbdc79f21c15f
|
|
| BLAKE2b-256 |
d837af37f979c8cb46da7fd17e612454aacae05a5885d1edcba965ec1342c702
|