Extracts fields from a value into local bindings.
Syntax: ex <expression> <fixum|varia> <field> [, ...] [ceteri <ident>]
Category
destructuring
Related
Examples
examples/corpus/destructura/lista.fab (canonical · keyword)
Extracts fields from a value into local bindings.
# destructura — lista destructuring patterns
#
# fixum [a, b, c] ← lista
# varia [x, y, z] ← lista
# fixum [caput, ceteri cauda] ← lista
# fixum [_, medius, _] ← lista
#
# GRAMMAR:
# destructStmt :← ('fixum' | 'varia') '[' patternList ']' '←' expr
#
# EXPECTED OUTPUT:
# Element values from inline and bound listas, rest slices, nested rows.
incipit {
# --- Basic lista destructuring ---
fixum _ numeri ← [1, 2, 3]
fixum [a, b, c] ← numeri
nota a
nota b
nota c
# Destructure inline lista literal
fixum [primus, secundus, tertius] ← [10, 20, 30]
nota primus
nota secundus
nota tertius
# --- Mutable destructuring with varia ---
fixum _ coordinata ← [100, 200]
varia [x, y] ← coordinata
nota x
nota y
x ← x + 50
y ← y + 50
nota x
nota y
# --- Partial destructuring (fewer variables than elements) ---
fixum _ valores ← [1, 2, 3, 4, 5]
fixum [unus, duo] ← valores
nota unus
nota duo
# --- Rest pattern with ceteri ---
fixum _ res ← [1, 2, 3, 4, 5]
fixum [caput, ceteri cauda] ← res
nota caput
nota cauda
# --- Skip elements with underscore ---
fixum _ triplex ← [10, 20, 30]
fixum [_, medius, _] ← triplex
nota medius
# --- Nested listas ---
fixum _ matrix ← [[1, 2], [3, 4]]
fixum [ordo1, ordo2] ← matrix
nota ordo1
nota ordo2
}Expected output:
1
2
3
10
20
30
100
200
150
250
1
2
1
[1, 2, 3, 4, 5]
20
[1, 2]
[3, 4]
examples/corpus/destructura/objectum.fab (canonical · keyword)
Extracts fields from a value into local bindings.
# destructura — field destructuring with `ex`
#
# ex <expr> fixum <field>, ...
# ex <expr> varia <field>, ...
# ex <expr> fixum <field> ut <alias>
# ex <expr> fixum <field>, ceteri <rest>
#
# Field destructuring works on genus records (fixed fields) and tabula/valor
# (open shapes). This tour uses genus types so that field names are statically
# known and codegen-complete.
#
# GRAMMAR:
# destructStmt :← 'ex' expr ('fixum' | 'varia') patternList
#
# EXPECTED OUTPUT:
# Extracted field values, aliased names, mutated varia bindings, rest maps.
genus Persona {
textus nomen
numerus aetas
textus urbs
}
genus Civis {
textus nomen
textus epistula
}
genus Datum {
numerus numerus
bivalens activus
}
genus Forma {
textus hospes
numerus portus
bivalens tutus
}
genus Plenus {
numerus signum
textus nomen
textus epistula
textus munus
}
genus CivisNested {
textus nomen
bivalens probatus
}
genus DatumNested {
CivisNested civis
}
genus Responsum {
DatumNested datum
}
genus Vestis {
textus modus
textus lingua
}
incipit {
# --- Basic field extraction ---
fixum _ persona ← Persona { nomen = "Marcus", aetas = 30, urbs = "Roma" }
ex persona fixum nomen, aetas
nota nomen
nota aetas
# --- Extract with alias using 'ut' ---
fixum _ civis ← Civis { nomen = "Julia", epistula = "julia@roma.com" }
ex civis fixum nomen ut cognomen, epistula ut epistula2
nota cognomen
nota epistula2
# --- Mutable destructuring with varia ---
fixum _ datum ← Datum { numerus = 100, activus = verum }
ex datum varia numerus, activus
nota numerus
nota activus
numerus ← 200
activus ← falsum
nota numerus
nota activus
# --- Mixed alias and regular fields ---
fixum _ forma ← Forma { hospes = "localis", portus = 8080, tutus = verum }
ex forma fixum hospes, portus ut porta, tutus
nota hospes
nota porta
nota tutus
# --- Rest pattern with ceteri ---
fixum _ plenus ← Plenus { signum = 1, nomen = "Gaius", epistula = "g@roma.com", munus = "admin" }
ex plenus fixum signum, ceteri reliqua
nota signum
nota reliqua
# --- Destructura ex nested path ---
fixum _ responsum ← Responsum { datum = DatumNested { civis = CivisNested { nomen = "Claudia", probatus = verum } } }
ex responsum.datum.civis fixum nomen ut internum, probatus
nota internum
nota probatus
# --- Single field extraction ---
fixum _ vestis ← Vestis { modus = "nigrum", lingua = "la" }
ex vestis fixum modus
nota modus
}examples/corpus/ex/ex.fab (canonical · keyword)
Extracts fields from a value into local bindings.
# ex — field extract statement
#
# GRAMMAR:
# extractStmt :← 'ex' expr bindingList
#
# EXPECTED OUTPUT:
# Scalar stdout smoke (see body).
#
# BACKEND:
# Cross-ref: destructura/objectum.fab, itera/ex.fab (itera ex mode).
#
genus Persona {
textus nomen
numerus aetas
}
incipit {
fixum _ p ← Persona { nomen = "Marcus", aetas = 30 }
ex p fixum nomen, aetas
nota nomen
nota aetas
}Expected output:
Marcus
30
examples/corpus/itera/ex.fab (canonical · keyword)
Extracts fields from a value into local bindings.
# itera ex — for-in value iteration over listas
#
# itera ex <collection> fixum <item> { <body> }
#
# GRAMMAR:
# forInStmt :← 'itera' 'ex' expr 'fixum' ident block
#
# EXPECTED OUTPUT:
# ex.expected — numbers, names, and doubled values.
incipit {
# Iterate over number lista
fixum _ numeri ← [1, 2, 3, 4, 5]
itera ex numeri fixum n {
nota n
}
# Iterate over textus lista
fixum _ nomina ← ["Marcus", "Julia", "Claudia"]
itera ex nomina fixum nomen {
nota nomen
}
# Transform values
fixum _ valores ← [10, 20, 30]
itera ex valores fixum v {
fixum _ duplex ← v * 2
nota duplex
}
}Expected output:
1
2
3
4
5
Marcus
Julia
Claudia
20
40
60