渲染zh-Hans

Functions and control flow

Functions#

Faber 中的函数使用 函数 声明,采用类型在前的参数语法,并使用字形标注返回类型。

基本语法#

函数 twice(整数 n) → 整数 {
    返回 n
}

带有错误通道时:

函数 parse(文本 input) → 整数 ⇥ 文本 {
    返回 0
}

示例#

# No parameters, no return
函数 saluta() → 无值 {
    显示 "Salve, Mundus!"
}

# Parameter, no explicit return
函数 dic(文本 verbum) → 无值 {
    显示 verbum
}

# Parameter and return type
函数 duplica(整数 n) → 整数 {
    返回 n * 2
}

# Multiple parameters
函数 adde(整数 a, 整数 b) → 整数 {
    返回 a + b
}

返回值#

使用 返回 进行正常返回:

函数 porta(整数 x) → 整数 {
    如果 x ≺ 0 则 返回 0
    返回 x * 2
}

当返回类型为 无值 时,使用裸 返回:

函数 tace() → 无值 {
    返回
}

借用与可变性(借自、in、取自)#

Faber 通过参数上的短介词来标记值的传递方式:

标记用途典型的 Rust 降阶
(无)拥有的值按值传递 T
借自共享借用(只读)&T
传入可变借用&mut T
拥有消耗(移动到被调用方)按移动传递 T
# Shared borrow
functio imprime(de textus label) → vacuum {
    nota label
}

# Mutable borrow
functio duplica(in numerus value) → vacuum {
    value ← value * 2
}

# Consume
functio consume(own textus buffer) → textus {
    redde buffer
}

# Owned
functio salve(textus nomen) → textus {
    redde "Salve, §!"(nomen)
}

相同的词(借自、取自)在其他构造中也会复用——不要把每个 取自 都解读为"消耗":

用法角色
参数上的 借自 文本 name共享借用
参数上的 传入 整数 count可变借用
参数上的 拥有 文本 buffer移动到被调用方
遍历 取自 items 常量 item遍历值
遍历 借自 映射 常量 key遍历键
取自 source 常量 x, 其余 rest解构字段
导入 取自 "path"从模块导入

入口点#

程序入口点是 入口:

入口 {
    显示 "ingressus"
}

CLI 入口点#

对于 CLI 程序,入口 参数 接收解析后的命令参数:

@ cli "echo"
@ descriptio "Prints text"
@ operandus ceteri textus words
incipit argumenta args {
    itera ex args.words fixum word {
        nota word
    }
}

传递模式——可选#

可选 标记调用方可省略的参数:

函数 connect(文本 host, 整数 port 可选) → 无值 {
    显示 host
}

Control flow#

条件分支#

如果 / 否则如果 / 否则#

入口 {
    常量 _ condition ← 真
    如果 condition {
        # truthy branch
        显示 "matched"
    }
}

包含 else-if 与 else:

入口 {
    常量 _ score ← 85
    如果 score ≥ 90 {
        显示 "A"
    }
    否则如果 score ≥ 80 {
        显示 "B"
    }
    否则 {
        显示 "C"
    }
}

使用 则 的紧凑分支#

单语句分支体使用 则:

函数 classify(整数 b, 布尔 ready, 整数 value) → 整数 ∪ 空类型 {
    如果 b ≡ 0 则 返回 皆无
    如果 ready 则 返回 value
    返回 皆无
}

迭代#

值 —— 遍历 取自#

函数 inveni(列表<整数> items, 整数 target) → 整数 ∪ 空类型 {
    遍历 取自 items 常量 item {
        如果 item ≡ target 则 返回 item
    }
    返回 皆无
}

键 —— 遍历 借自#

入口 {
    常量 映射<文本, 整数> 映射 ← { "unus": 1, "duo": 2 }
    遍历 借自 映射 常量 key {
        显示 key
    }
}

范围 —— 遍历 范围#

遍历 范围 0‥10 常量 i {
    显示 i
}

while 循环#

入口 {
    常量 _ condition ← 真
    当 condition {
        # body
        静默
    }
}

守卫段 —— 守护#

守护 用于在函数主体之前组织提前退出检查。 每一条 如果 子句都是一个顺序守卫:

函数 divide(整数 a, 整数 b) → 整数 {
    守护 {
        如果 b ≡ 0 {
            返回 0
        }
    }
    返回 a / b
}

守护 在 v1 中不可被 break —— 它是护栏,不是循环。

模式匹配 —— 选择#

选择 选择第一个匹配的分支:

函数 describe(整数 value) → 文本 {
    选择 value {
        情况 1 {
            返回 "one"
        }
        情况 2 {
            返回 "two"
        }
        默认 {
            返回 "many"
        }
    }
}

标签联合匹配 —— 匹配#

匹配 对 判别 变体进行穷尽匹配:

判别 Exitus {
    Bonum {
        文本 nuntius
    },
    Malum {
        文本 causa
    }
}

函数 refer(Exitus eventus) → 文本 {
    匹配 eventus {
        情况 Bonum 常量 nuntius {
            返回 nuntius
        }
        情况 Malum 常量 causa {
            返回 "Error: §"(causa)
        }
    }
}

try 块 —— 执行 / 捕获#

执行 开启一个可能抛出的块,捕获 负责恢复:

函数 divide(整数 a, 整数 b) → 整数 {
    返回 a / b
}

函数 tutus(整数 a, 整数 b) → 整数 {
    执行 {
        返回 divide(a, b)
    }
    捕获 err {
        警告 err
        返回 0
    }
}

Generics#

函数、类型别名、类 与 契约 接受类型参数,使用 <T> 语法。

泛型函数#

函数 identitas<T>(T 动态值) → T {
    返回 动态值
}

函数 primum<T>(列表<T> res) → T ∪ 空类型 {
    返回 res.第一个()
}

显式调用处类型参数#

函数 identitas<T>(T 动态值) → T {
    返回 动态值
}

函数 primum<T>(列表<T> res) → T ∪ 空类型 {
    返回 皆无
}

入口 {
    常量 _ value ← identitas<整数>(7)
    常量 _ maybe ← primum<整数>([value])
}

泛型 类#

类 Par<T> {
    常量 T primus
    常量 T secundus
}

尺寸参数#

维度 在泛型参数列表中声明一个尺寸/索引参数:

函数 crea<T, 维度 N>() → 张量<T, [N]> {
    返回 空集
}