Chains
Chains are Astra's most powerful feature — a single concept that combines arrays, structs, and JSON-like records. No imports, no classes, no boilerplate.
📋
Array-style
Store multiple values in sequence
🏗️
Struct-style
Named fields like objects
⚙️
Methods
Functions attached to chains
Simple Chains
Create a chain with name:n = values:
a:n = 10, 20, 30, 40, 50
write a:n \\ 10 20 30 40 50
Chains can hold any type — integers, floats, strings, booleans:
nums:n = 1, 2, 3, 4, 5
names:n = "Alice", "Bob", "Charlie"
flags:n = true, false, maybe
mixed:n = 42, "hello", 3.14, true
write nums:n \\ 1 2 3 4 5
write names:n \\ Alice Bob Charlie
Accessing Elements
Access elements by index (starting at 1) using name[i] or name1, name2...
a:n = 10, 20, 30, 40, 50
write a[1] \\ 10
write a[3] \\ 30
write a[5] \\ 50
\\ Also works with direct name
write a1 \\ 10
write a2 \\ 20
Updating Elements
Update any element using its index:
a:n = 10, 20, 30
write a:n \\ 10 20 30
a[2] = 99
write a:n \\ 10 99 30
\\ Also works with direct name
a2 = 55
write a:n \\ 10 55 30
Named-field Chains
Add field names to create struct-like records:
p:n(name, age) = ("Alice", 30), ("Bob", 25), ("Charlie", 35)
write p1:name \\ Alice
write p1:age \\ 30
write p2:name \\ Bob
write p3:age \\ 35
Update named fields
p:n(name, score) = ("Alice", 85)
p1:score = 95
write p1:name \\ Alice
write p1:score \\ 95
Dynamic field access in loops
students:n(name, score) = ("Alice", 90), ("Bob", 85), ("Charlie", 95)
repeat i to len(students:n)
write students[i]:name + " scored " + students[i]:score
;
Nested Fields
Fields can have sub-fields using nested parentheses:
p:n(name, adr(city, zip)) = ("Alice", ("NYC", 10001))
write p1:name \\ Alice
write p1:adr:city \\ NYC
write p1:adr:zip \\ 10001
Chain Methods
Attach methods to a chain using chainName:n:methodName(). Fields are accessible directly inside methods — no self: prefix needed!
p:n(name, score, grade)
p:n:showResult()
write "Student: " + name
write "Score : " + score
write "Grade : " + grade
;
p:n:isPassed()
if score >= 50
write name + " — PASSED"
else
write name + " — FAILED"
;
;
Calling methods
\\ Call on specific object
p1:showResult()
\\ Call in a loop
repeat i to len(p:n)
p[i]:showResult()
p[i]:isPassed()
;
self() — Adding Objects
Use self() to add new objects to an existing chain:
\\ Define chain structure
a:n(name, score, grade)
\\ Define methods
a:n:showResult()
write name + " — " + score + " (" + grade + ")"
;
\\ Add objects using self()
self(a:n, "Alice", 95, "A")
self(a:n, "Bob", 72, "B")
self(a:n, "Charlie", 45, "F")
\\ Use them
repeat i to len(a:n)
a[i]:showResult()
;
Chain Functions
Built-in functions for working with chains:
len() — Length
a:n = 10, 20, 30, 40, 50
write len(a:n) \\ 5
sort() — Sort
a:n = 30, 10, 50, 20, 40
sort(a:n)
write a:n \\ 10 20 30 40 50
\\ Strings too
names:n = "Charlie", "Alice", "Bob"
sort(names:n)
write names:n \\ Alice Bob Charlie
merge() — Merge two chains
a:n = 1, 2, 3
b:n = 4, 5, 6
merge(a:n, b:n)
write a:n \\ 1 2 3 4 5 6
write len(a:n) \\ 6
unique() — Remove duplicates
a:n = 1, 2, 2, 3, 3, 3, 4
unique(a:n)
write a:n \\ 1 2 3 4
info — Chain Inspector
a:n = 10, 20, 30
info a:n
Loop with Chains
\\ Sum all values
nums:n = 10, 20, 30, 40, 50
total = 0
repeat i to len(nums:n)
total += nums[i]
;
write "Total: " + total \\ Total: 150
\\ Find max
max = nums[1]
repeat i to len(nums:n)
if nums[i] > max
max = nums[i]
;
;
write "Max: " + max \\ Max: 50