内建类型表面

本文档收敛 Dujie 第一阶段中各内建类型对外暴露的方法、属性和相关约束。

目标不是重新定义这些类型的语义,而是把已经散落在类型系统、表达式系统和渲染内建中的公开表面集中列出来。

总体原则

  • 第一阶段不支持用户自定义方法
  • 点调用形式只对语言内建方法开放
  • x.ystruct 上表示字段访问,不表示内建属性系统
  • 第一阶段不提供独立的“内建属性”目录;当前公开表面以方法和语言构造为主

也就是说,像 list.push(...)iter.map(...) 这样的点调用属于语言内建能力,不代表语言已经开放了通用方法系统。

无公开内建属性

第一阶段以下类型都不提供额外的公开内建属性:

  • int
  • float
  • bool
  • rune
  • string
  • list<T>
  • map<K, V>
  • opt<T>
  • iter<T>
  • any
  • widget
  • unit

如果需要获取附加信息,当前统一通过方法或语言构造表达,例如:

  • xs.len()
  • m.contains(k)
  • x is some(v)

而不是:

  • xs.len
  • m.size
  • x.value

list<T>

list<T> 是有序稳定容器。

下标

  • xs[i] -> T
  • xs[i] = v

运行时规则:

  • 读取越界时 panic
  • 写入越界时 panic

方法

  • len() -> int
  • push(value: T)
  • pop()
  • remove(index: int)
  • clear()

约束:

  • push / pop / remove / clear 都属于更新操作
  • 更新操作只能作用于 var 绑定的可写左值
  • pop() 对空列表调用时 panic
  • remove(index) 越界时 panic

map<K, V>

map<K, V> 是键值字典。

key 约束

当前 K 必须满足 key 约束,也就是只能是:

  • int
  • bool
  • rune
  • string

下标

  • m[k] -> V
  • m[k] = v

运行时规则:

  • 读取缺 key 时 panic
  • 写入缺 key 时直接插入

方法

  • len() -> int
  • contains(key: K) -> bool
  • remove(key: K)
  • clear()

约束:

  • remove / clear 属于更新操作
  • 更新操作只能作用于 var 绑定的可写左值
  • remove(key) 在 key 不存在时 panic

opt<T>

opt<T> 当前不提供普通点调用方法。

它的公开表面由语言构造组成:

  • none
  • some(value)
  • x is none
  • x is some(v)

参数位置上的额外规则:

  • 参数类型为 opt<T> 时允许省略
  • 省略等价于传入 none
  • 直接传入 T 时,自动提升为 some(T)

第一阶段不提供:

  • unwrap
  • unwrap_or
  • map
  • filter
  • 其他链式方法

iter<T>

iter<T> 是遍历用中间类型。

方法

  • map(f) -> iter<U>
  • filter(f) -> iter<T>
  • collect() -> list<T>

其中:

  • map 要求回调形如 func(T) -> U
  • filter 要求回调形如 func(T) -> bool

这些方法属于语言内建泛型方法,不代表语言支持用户自定义方法。

额外规则

  • iter<T> 可用于 for x in expr
  • iter<T> 不支持下标访问
  • iter<T> 不建议长期保存到字段或容器中

string

string 第一阶段不提供公开点调用方法和属性。

当前稳定能力主要来自:

  • 字面量:"..."、插值字符串
  • 比较:== != < <= > >=
  • 作为 text(...) 输入

第一阶段不提供:

  • 下标访问
  • 直接迭代
  • 语言内建字符串方法表面

基础数值与布尔类型

以下类型第一阶段都不提供公开点调用方法和属性:

  • int
  • float
  • bool
  • rune

当前稳定能力主要来自:

  • 字面量
  • 运算
  • 比较
  • 少量显式转换

any

any 第一阶段不提供普通点调用方法和属性。

它的公开表面主要来自:

  • 装箱:T -> any
  • 显式收窄:x is Tx is T(v)

第一阶段不提供:

  • 成员访问
  • 下标访问
  • 方法调用
  • 普通运算

widget

widget 是抽象渲染结果类型。

第一阶段不提供公开点调用方法和属性。

它的公开表面主要来自:

  • 作为 text / fragment / comment / element / main 的返回类型
  • 作为普通值参与赋值、传参、返回和组合

相关文档