A basic package for parsing lisp-like linked lists in Python.
Project description
llll
Python support for lisp-like linked lists (llll).
Key Features
- Read/write operations in both text (
.txt) and native (.llll) formats. - 1-based indexing following the bach library and bell language conventions.
- Element-wise arithmetic with automatic broadcasting.
- Flexible mapping with depth control.
- Address and key syntax support for data access and assignment.
- Fraction support for exact rational arithmetic.
Installation
pip3 install llll-py
Basic Usage
Creating lllls
from llll import llll
# Atomic values
x = llll(42) # 42
y = llll("hello") # hello
# Nested lists
z = llll(1, 2, [3, 4], 5) # 1 2 [ 3 4 ] 5
# From Python objects
data = llll.from_python([1, [2, 3], 4]) # 1 [ 2 3 ] 4
File I/O
# Save to file
l = llll(1, 2, [3, 4])
l.write("data.txt") # Human-readable format
l.write("data.llll") # Native llll format
# Load from file
from_txt = llll.read("data.txt")
from_llll = llll.read("data.llll")
print(l == from_txt == from_llll) # True
Indexing
llll uses 1-based indexing by convention:
l = llll(10, 20, [30, 40], 50)
l[1] # 10
l[-1] # 50
l[3] # 30 40
l[3, 2] # 40 (address-based access)
# Slicing (1-based, inclusive)
l[2:3] # 20 [ 30 40 ]
Keys
Access and modify lllls via keys:
l = llll(["name", "Alice"], ["age", 33], ["parents", "Bob", "Chloe"])
# Access by key
l["name"] # "Alice"
l["age"] # 33
l["parents"] # "Bob" "Chloe"
# Assignment by key
l['name'] = "John"
l['age'] = 55
l['parents'] = ["Geoffrey", "Ada"]
# [ name John ] [ age 33 ] [parents Geofrrey Ada ]
Arithmetic Operations
Element-wise operations with broadcasting:
l = llll(1, 2, 3)
l + 10 # 11 12 13
l * llll(2, 3, 4) # 2 6 12
l / 2 # 1/2 1 3/2 (returns Fractions for int division)
# Nested operations
nested = llll([1, 2], [3, 4])
nested + 10 # [ 11 12 ] [ 13 14 ]
Mapping
Apply functions at specific depths:
l = llll(1, [2, 3], [[4, 5], 6])
# Boolean comparison
l.map(lambda x, addr: int(x > 2))
# 0 [ 0 1 ] [ [ 1 1 ] 1 ]
# Apply only at depth 2
l.map(lambda x, addr: x * 10,
mindepth=2,
maxdepth=2)
# 1 [ 20 30 ] [ [ 4 5 ] 60 ]
The mapping function receives both the value and its address (tuple of indices).
Utility Methods
l = llll(1, [2.5, 3])
l.depth() # 2
l.to_python() # [1, [2.5, 3]]
l.append([4, 5]) # 1 [ 2.5 3 ] [ 4 5 ]
l.extend([4, 5]) # 1 [ 2.5 3 ] 4 5
l.as_float() # 1.0 [ 2.5 3.0 ] 4.0 5.0
l.as_int() # 1 [ 2 3 ] 4 5
License
MIT License - Copyright © 2025 Felipe Tovar-Henao
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 llll_py-0.1.0.tar.gz.
File metadata
- Download URL: llll_py-0.1.0.tar.gz
- Upload date:
- Size: 6.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.12.4 Darwin/25.1.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a90d7a7c775db429d831ab11b4cf0bc91fb588bb8bdbb8937aa2550e41c4e5d7
|
|
| MD5 |
e7e9d7d5daf473d546984cc0d3fc1f3b
|
|
| BLAKE2b-256 |
9274eb94f6fea4bad0e60b248aa9b750fefce604340f0830522cd7e2e05a9b21
|
File details
Details for the file llll_py-0.1.0-py3-none-any.whl.
File metadata
- Download URL: llll_py-0.1.0-py3-none-any.whl
- Upload date:
- Size: 7.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.12.4 Darwin/25.1.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e69a2dc8131065e3b081dd9535b9b5907dd0113011a40ea792085c84fc9564d
|
|
| MD5 |
57a726359711676d7cab736ed76ac872
|
|
| BLAKE2b-256 |
340090dd7f3227522be3beeb819f73dbf13e1eaa6cc3235161be852dbec92ec8
|