Renderingla

discerne

Starts an exhaustive pattern match over a value or values.

Aliases: match

Syntax: discerne <subject> <block>

Category

control-flow

Related

Examples

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

Starts an exhaustive pattern match over a value or values.

# discerne — pattern matching on discretio values
#
# discerne <value> {
#     casu <Casus> { <body> }
#     casu <Casus> ut <alias> { <body> }
#     casu <Casus> fixum <bindings> { <body> }
#     casu <Casus> fixum <field> ut <alias> { <body> }
# }
#
# GRAMMAR:
#   discerneStmt :← 'discerne' expr '{' casuClause* '}'
#
# EXPECTED OUTPUT:
#   discerne exempla parata

# discretio — tagged union / enum declaration
discretio Condicio {
    Agens,
    Iners,
    Pendens
}

discretio Nuntius {
    Pulsus { numerus x, numerus y },
    Clavis { textus clavis },
    Finis
}

# Simple casu matching on unit variants (no payload)
functio nomina(Condicio s) → textus {
    discerne s {
        casu Agens { redde "agens" }
        casu Iners { redde "iners" }
        casu Pendens { redde "pendens" }
    }
}

# casu with fixum bindings destructures variant fields
functio tracta(Nuntius e) → nihil {
    discerne e {
        casu Pulsus fixum x, y {
            nota "pulsus: § §"(x, y)
        }
        casu Clavis fixum clavis {
            nota "clavis: §"(clavis)
        }
        casu Finis {
            nota "finis"
        }
    }
}

incipit {
    # nomina/tracta are defined for downstream exempla; smoke check only
    nota "discerne exempla parata"
}

Expected output:

discerne exempla parata