union
Translation status: English reader-locale proof. Term names and code fences follow the en pack; supporting prose may still be English.
Declares a tagged union with variant payloads.
Aliases: union, sum type
Syntax: union <name> [<type-params>] <block>
Category#
type
Related#
Examples#
radix/corpus/discretio/discretio.fab (canonical · keyword)#
Declares a tagged union with variant payloads.
# =============================================================================
# union — Declares a tagged union with variant payloads.
# =============================================================================
#
# What this teaches:
# • Tagged union declaration — `union <name> { <Variant> { fields }, ... }` declares a sum type with named variants.
# • Payload variants — variants can carry named fields (like structs) or be unit variants with no payload.
# • Multiple field variants — a variant can have many fields of different types.
#
# Common mistakes:
# • Confusing `union` with `class` — `union` is a tagged union with variants, not a record with fixed fields; use `match` (not field access) to unpack values.
#
# See also: enum, match, variant
# =============================================================================
# union — tagged union declarations
#
# union Nomen {
# Varians { <type> <field>, ... }
# Alius
# }
#
# GRAMMAR:
# discretioDecl :← 'union' ident '{' variantDecl* '}'
# variant :← ident ('{' fieldDecl (',' fieldDecl)* '}')?
#
# EXPECTED OUTPUT:
# discretiones paratae
# Discretio with payload variants
union Exitus {
Bonum {
string nuntius
},
Malum {
string causa
}
}
# Discretio with mixed unit and payload variants
# (Finis is a unit variant — no payload fields)
union Actum {
Pulsus {
int x
int y
},
Clavis {
string clavis
},
Finis
}
# Discretio with many fields per variant
union Figura {
Rectum {
int x
int y
int latitudo
int altitudo
},
Circulus {
int cx
int cy
int radius
},
Punctum {
int x
int y
}
}
main {
print "discretiones paratae"
}Expected output:
discretiones paratae