sourceacademy-sicp
The Source Academy Python standard library, packaged for plain CPython.
Source Academy runs a subset of Python (via
py-slang) that adds a standard
library for the Structure and Interpretation of Computer Programs (SICP) —
pair, head, tail, llist, the math_* functions, streams, and so on.
This package provides those same names to ordinary CPython, so that code written
for CS1101S or the SICP Python edition runs the same way on your own machine.
Install
pip install sourceacademy-sicp
Use
Put this at the top of your program:
from sicp import *
Then the Source Academy Python standard library is available:
xs = llist(1, 2, 3)
print(xs) # [1, [2, [3, None]]]
print_llist(xs) # llist(1, 2, 3)
print(list_length([1, 4, 9, 16, 25])) # 5
print(math_sqrt(2)) # 1.4142135623730951
print(eval_stream(integers_from(1), 4)) # [1, [2, [3, [4, None]]]]
Representation
A pair is a two-element Python list [head, tail], and the empty list
is None — exactly as in Source Academy Python. A two-element list is therefore
also a pair (is_pair and is_list are both true), matching the frontend's
value model, so results print and compare directly against the textbook:
pair("x", 9) # ['x', 9]
llist(1, 2, 3) # [1, [2, [3, None]]]
What's included
The library mirrors the groups in py-slang's standard library:
| submodule | provides |
|---|---|
sicp.misc |
error, arity, real, imag, is_none / is_integer / is_float / is_complex / is_string / is_boolean / is_function / is_number, random_random, time_time |
sicp.math |
math_pi, math_e, math_tau, math_inf, math_nan, and the math_* functions (math_sqrt, math_sin, math_floor, math_comb, …) |
sicp.linked_list |
pair, head, tail, is_pair, llist, print_llist, plus map, filter, reduce, reverse, append, length, member, remove, enum_llist, … |
sicp.pair_mutators |
set_head, set_tail |
sicp.list |
is_list, list_length, equal |
sicp.stream |
stream, stream_map, stream_filter, stream_ref, integers_from, eval_stream, … |
from sicp import * brings the whole superset into scope, mirroring the
environment students have in Source Academy's Python.
For the full documentation of every function — signatures, descriptions, and
worked examples — see the Python §4 standard library
reference. Its groups (MISC,
MATH, LINKED LISTS, PAIR MUTATORS, LISTS, STREAM, MCE) correspond to the
sicp.<group> submodules above.
Compatibility
- Requires Python 3.10+.
is_numbermirrors Scheme'snumber?primitive as used in the textbook.round,abs,len,max,min,str,repr,int,float,complex,bool,print, andinputare plain CPython builtins, not reimplementations of Source Academy Python's versions, so a few edge cases differ:arity()raises on a handful of CPython builtins whose signature isn't introspectable (e.g.arity(print),arity(max),arity(min),arity(str)), where Source Academy Python's ownarityreturns a value.is_function(int)andis_function(str)areTruehere, since CPython'scallable()treats classes as callable — Source Academy Python's tag-based check would sayFalse.max/minaccept the single-iterable form (max([1, 2, 3])); Source Academy Python's versions require two or more direct arguments.
Source & development
This package lives in the py-slang
repository under python/. py-slang is the reference implementation of Source
Academy Python, so keeping the library here — next to the standard library it
mirrors (src/stdlib/) — is what keeps the two from drifting apart. Each
sicp.<group> submodule corresponds to a py-slang stdlib group.
cd python
python -m pip install -e . # editable install for development
python -m pytest # or: PYTHONPATH=. python tests/test_sicp.py
python -m build # build the wheel + sdist
Releasing
Publishing to PyPI is not automatic on push or merge. The CI test job runs
on every change under python/**, but the publish job runs only when a
GitHub Release is published (.github/workflows/python-package.yml).
One-time setup: configure a PyPI Trusted
Publisher for the
sourceacademy-sicp project pointing at this repository and the
python-package workflow (or swap the publish step for a token-based upload).
To cut a release:
- Bump
versioninpyproject.toml. PyPI rejects re-uploads of an existing version, so this must change every time. - Merge to
main. - Create and publish a GitHub
Release (a tag such
as
sicp-vX.Y.Z). Publishing it triggers thepublishjob, which builds the wheel + sdist and uploads them to PyPI.
License
Apache-2.0. Part of the Source Academy project.
Metadata
Release files for sourceacademy-sicp 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sourceacademy_sicp-0.2.1.tar.gz | 16.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sourceacademy_sicp-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 32.7 kB
Release files / sourceacademy_sicp-0.2.1.tar.gz
| Download URL | sourceacademy_sicp-0.2.1.tar.gz |
|---|---|
| Size | 16.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d2c66776dc6bc260f0f41d3a0026635dda30f5e668dca346e49d673a0ef2c54c
|
|
BLAKE2b-256 checksum How to use checksums |
fdc7bd71c227c26b144771b8abb9356376539680c60ee0956ee06965eb7b77ae
|
| 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 Jul 31, 2026.
Transparency logRelease files / sourceacademy_sicp-0.2.1-py3-none-any.whl
| Download URL | sourceacademy_sicp-0.2.1-py3-none-any.whl |
|---|---|
| Size | 15.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bb14b3e39f18192a47fe56b38e02c73806a9662a044919b07a5b176d082a221e
|
|
BLAKE2b-256 checksum How to use checksums |
65b0fed1e65cef02084838f90ebf04155f515dc9379543f7f2fd0cc53a938269
|
| 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 Jul 31, 2026.
Transparency log