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:

chains.astra
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:

named-chain.astra
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:

nested.astra
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!

methods.astra
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:

self.astra
\\ 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

chain-loop.astra
\\ 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