Renderingla

ex

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