Files
core/skills/references/language.md
T
2026-11-03 03:32:07 +00:00

79 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 语法速查
源码用 `.dever`,说明写法见 [源码与说明](documentation.md)。完整规则见安装根 LANGUAGE.md,函数参数见 [签名索引](signatures.md)。
## 类型和函数
源码:[模板 App](../assets/template/module/hello/greeting/app.dever)
```dever
greet(name: Text) (message: Text) {
message = "Hello, " + name
}
```
函数为 `名称(输入) (命名输出)`,按位置调用;没有输入或输出仍写 `()`。单输出直接得到值,多输出按名字访问。正常结束前须给输出赋值。
类型用 UpperCamelCase,函数用 lowerCamelCase;字段、局部值和目录用 snake_case。record 构造一次给全字段,choice 按分支构造。App 的公开参数和输出不能暴露 Domain/Adapter 的私有类型。
局部值通常由表达式推断类型。解码、空集合或 null 需要上下文时,首次写 `input: CreateInput = dever.json.decode(payload)`;后续只写 `input = ...`,类型不变。不为提供类型另写包装函数。
常用类型有 Bool、Int、Decimal、Float、Text、Bytes、Id、Uuid、日期时间、Json、Secret;可空为 T?,集合为 List<T>、Map<K,V>。Model ID 是每个 Model 独有的类型。
集合成员判断用 `contains(values, target)`。条件不满足时失败用 `dever.api.require(condition, dever.api.Error.Invalid)`,不为每个条件写一对 true/false 函数。状态分支仍用分句表达。
| 易混规则 | 语义 |
| --- | --- |
| 小数字面量 | 默认 Decimal,科学计数形式为 Float |
| 数值运算 | Int/Int 的 / 返回 Decimal;// 为整数除法 |
| 可空值 | 用分句处理,没有隐式默认值或强制解包 |
| Map | 保留插入顺序,相等比较也包含顺序 |
| 普通值 | 修改副本不影响原值 |
| 资源 | 副本共享读取位置或关闭状态 |
## 分句
条件使用同名函数分句,必须相邻、互斥且穷尽;没有顺序优先级。other 表示该参数位置未被明确模式覆盖的值。
源码:[分句测试](../assets/examples/collections/test/content/article/clauses.dever)
```dever
grade(score: Int<60) (text: Text) {
text = "fail"
}
grade(score: Int >= 60) (text: Text) {
text = "pass"
}
```
模式支持类型、choice 分支、null、常量及 Int/Decimal 范围,多参数检查全部组合。没有 if/else、match、return、任意循环或递归。
## 集合与处理函数
| 调用 | 结果 |
| --- | --- |
| each(handler, list) | handler 单输出时映射为 List,零输出时遍历 |
| filter(handler, list) | 按 Bool 输出筛选 |
| find(handler, list) | 第一个匹配值或 null |
| sum(list) | 数值求和 |
| reduce(handler, values, initial) | 按“元素、累计值”调用,空集合返回 initial |
| reduceUntil(handler, values, initial) | handler 另输出 stop: Bool |
| parallelEach(handler, values, limit) | 并行执行零输出 handler,返回前全部收尾 |
使用具名 handler,无 lambda 或运行时闭包。each/filter/find/投影 sum 可带一个末尾 context;reduce 的共享数据放累计状态。完整用法见 [集合项目](../assets/examples/collections/)。
## 失败和并发
choice 的 error 分支声明业务失败;普通调用默认传播,fail 主动失败,result(call) 捕获后交给穷尽分句。主动恢复写 recover("具体理由"),不能用读取错误消息代替处理。
类型化 JSON 也可直接捕获:`decoded: DecodeResult = result(dever.json.decode(payload))`。结果 Choice 用一个成功字段指定目标类型,error 分支包装 `dever.json.JsonResult`;错误身份保持不变,参数失败仍向外传播。无载荷且无 error 分支的 Choice 在 API/CMD/JSON 中使用分支名字符串,其他 Choice 留在程序内部。
pure 禁止 I/O、时钟和并发等效果。外部 I/O 经 Port/Adapter;密码使用 dever.crypto,Secret 不可打印、比较或转为普通 Text。
普通调用顺序完成,挂起自动推断。run 启动 Task,wait/stop 消费;timeout 到期先清理再执行 fallback,race 清理未选中的任务。Task/Group 不得逃逸。同步阻塞操作用 blocking,纯计算可用 parallel。
Stream/AsyncStream/Channel 的能力与生命周期由编译器检查;result 只改变失败表示,不改变调度或访问权限。
Channel 不接受可空元素;关闭且缓存读完时 receive 返回 null。需要传递空值时,使用带可空字段的消息 Choice。