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

4.3 KiB
Raw Blame History

语法速查

源码用 .dever,说明写法见 源码与说明。完整规则见安装根 LANGUAGE.md,函数参数见 签名索引。

类型和函数

源码:模板 App

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、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 表示该参数位置未被明确模式覆盖的值。

源码:分句测试

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 的共享数据放累计状态。完整用法见 集合项目。

失败和并发

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。