Renderingla

genus

Declares a concrete type with fields and methods.

Aliases: class, struct

Syntax: genus <name> [<type-params>] <block>

Category

type

Related

Examples

examples/corpus/genus/genus.fab (canonical · keyword)

Declares a concrete type with fields and methods.

# Basic genus (record type) with fields
#
# genus <Name> {
#     <type> <property>
#     <type> <property> = <default>
# }
#
# GRAMMAR:
#   genusDecl :← 'genus' ident '{' fieldDecl* '}'
#   instance  :← ident '{' fieldInit (',' fieldInit)* '}'
#
# EXPECTED OUTPUT:
#   Field values for Punctum and Persona instances (defaults and overrides).

genus Punctum {
    numerus x
    numerus y
}

genus Persona {
    textus nomen
    # default when omitted at instantiation
    numerus aetas = 0
    bivalens activus = verum
}

incipit {
    # Instantiate with all required fields
    fixum _ p ← Punctum {
        x = 10,
        y = 20
    }

    nota p.x
    nota p.y

    # Instantiate with required + optional defaults
    fixum _ marcus ← Persona {
        nomen = "Marcus"
    }

    nota marcus.nomen
    # 0 from default
    nota marcus.aetas
    # verum from default
    nota marcus.activus

    # Override defaults explicitly
    fixum _ julia ← Persona {
        nomen = "Julia",
        aetas = 25,
        activus = falsum
    }

    nota julia.nomen
    nota julia.aetas
    nota julia.activus
}

Expected output:

10
20
Marcus
0
verum
Julia
25
falsum