Renderingla

Introduces a compact statement consequent.

Aliases: ergo, therefore

Syntax: <head> ergo <statement>

Category

control-flow

Related

Examples

examples/corpus/operatores/control.fab (canonical · operator-group)

Compact consequent after si/dum heads via ergo, with ∴ reserved for closure bodies.

# operatores/control — ergo therefore consequent
#
# GRAMMAR:
#   consequentStmt :← ('si' | 'sin' | 'secus' | 'dum') expr 'ergo' stmt
#
# EXPECTED OUTPUT:
#   0, 100, 42
#
# BACKEND:
#   Cross-ref si/ergo-redde.fab for ergo-redde guard-return spelling.

functio clamp(numerus x) → numerus {
    si x < 0 ergo redde 0
    si x > 100 ergo redde 100
    redde x
}

functio inveni(lista<numerus> res, numerus quaesitum) → numerus ∪ nihil {
    itera ex res fixum item {
        si item ≡ quaesitum ergo redde item
    }
    redde nihil
}

incipit {
    nota clamp(-5)
    nota clamp(150)
    nota inveni([10, 20, 42], 42)
}

Expected output:

0
100
42

examples/corpus/si/ergo-redde.fab (canonical · operator-group)

Introduces a compact statement consequent.

# Si with ergo redde syntax
#
# si <conditio> ergo redde <expressio>     -- guard return
# sin <conditio> ergo redde <expressio>    -- else-if guard
# secus ergo redde <expressio>             -- else return
#
# GRAMMAR:
#   guardReturn :← ('si' | 'sin' | 'secus') expr 'ergo' 'redde' expr
#
# EXPECTED OUTPUT:
#   Sign classes, division results, grades, and search hits.

functio classis(numerus x) → textus {
    si x < 0 ergo redde "negativus"
    si x ≡ 0 ergo redde "nihil"
    redde "positivus"
}

# Optional return: nihil when divisor is zero
functio divide(numerus a, numerus b) → numerus ∪ nihil {
    si b ≡ 0 ergo redde nihil
    redde a / b
}

# sin chain with secus ergo redde fallback
functio gradus(numerus puncta) → textus {
    si puncta ≥ 90 ergo redde "A"
    sin puncta ≥ 80 ergo redde "B"
    sin puncta ≥ 70 ergo redde "C"
    sin puncta ≥ 60 ergo redde "D"
    secus ergo redde "F"
}

# Early return inside itera ex loop
functio inveni(lista<numerus> res, numerus quaesitum) → numerus ∪ nihil {
    itera ex res fixum item {
        si item ≡ quaesitum ergo redde item
    }
    redde nihil
}

functio habet(tabula<textus, numerus> tabula, textus clavis) → bivalens {
    itera de tabula fixum k {
        si k ≡ clavis ergo redde verum
    }
    redde falsum
}

incipit {
    # Sign classification
    nota classis(-5)
    nota classis(0)
    nota classis(10)

    # Optional return on invalid divisor
    # 5
    nota divide(10, 2)
    # nihil
    nota divide(10, 0)

    # Letter grades via sin chain
    nota gradus(95)
    nota gradus(85)
    nota gradus(55)

    # Linear search with early redde
    fixum _ numeri ← [1, 2, 3, 4, 5]
    nota inveni(numeri, 3)
    nota inveni(numeri, 9)
}

Expected output:

negativus
nihil
positivus
5
nihil
A
B
F
3
nihil

examples/corpus/si/ergo.fab (canonical · operator-group)

Introduces a compact statement consequent.

# One-liner conditionals with ergo
#
# si <condition> ergo <statement>                              -- single consequent
# si <condition> ergo <statement> secus ergo <statement>     -- if-else one-liner
#
# GRAMMAR:
#   ifStmt :← 'si' expr 'ergo' stmt ('secus' 'ergo' stmt)?
#
# EXPECTED OUTPUT:
#   Validation and grading lines for sample x, aetas, and puncta values.

incipit {
    # ergo replaces a one-statement block body
    fixum _ x ← 10

    si x > 5 ergo nota "x magnum est"

    # secus ergo pairs else with a single consequent
    fixum _ aetas ← 25
    si aetas ≥ 18 ergo nota "adultus"
    secus ergo nota "minor"

    # Two-way one-liner (85 < 90 → "non A")
    fixum _ puncta ← 85
    si puncta ≥ 90 ergo nota "A"
    secus ergo nota "non A"

    # bivalens condition used directly
    fixum _ valet ← verum
    si valet ergo nota "Recte"
}

Expected output:

x magnum est
adultus
non A
Recte