内建类型表面
本文档收敛 Dujie 第一阶段中各内建类型对外暴露的方法、属性和相关约束。
目标不是重新定义这些类型的语义,而是把已经散落在类型系统、表达式系统和渲染内建中的公开表面集中列出来。
总体原则
- 第一阶段不支持用户自定义方法
- 点调用形式只对语言内建方法开放
x.y在struct上表示字段访问,不表示内建属性系统- 第一阶段不提供独立的“内建属性”目录;当前公开表面以方法和语言构造为主
也就是说,像 list.push(...)、iter.map(...) 这样的点调用属于语言内建能力,不代表语言已经开放了通用方法系统。
无公开内建属性
第一阶段以下类型都不提供额外的公开内建属性:
intfloatboolrunestringlist<T>map<K, V>opt<T>iter<T>anywidgetunit
如果需要获取附加信息,当前统一通过方法或语言构造表达,例如:
xs.len()m.contains(k)x is some(v)
而不是:
xs.lenm.sizex.value
list<T>
list<T> 是有序稳定容器。
下标
xs[i] -> Txs[i] = v
运行时规则:
- 读取越界时
panic - 写入越界时
panic
方法
len() -> intpush(value: T)pop()remove(index: int)clear()
约束:
push / pop / remove / clear都属于更新操作- 更新操作只能作用于
var绑定的可写左值 pop()对空列表调用时panicremove(index)越界时panic
map<K, V>
map<K, V> 是键值字典。
key 约束
当前 K 必须满足 key 约束,也就是只能是:
intboolrunestring
下标
m[k] -> Vm[k] = v
运行时规则:
- 读取缺 key 时
panic - 写入缺 key 时直接插入
方法
len() -> intcontains(key: K) -> boolremove(key: K)clear()
约束:
remove / clear属于更新操作- 更新操作只能作用于
var绑定的可写左值 remove(key)在 key 不存在时panic
opt<T>
opt<T> 当前不提供普通点调用方法。
它的公开表面由语言构造组成:
nonesome(value)x is nonex is some(v)
参数位置上的额外规则:
- 参数类型为
opt<T>时允许省略 - 省略等价于传入
none - 直接传入
T时,自动提升为some(T)
第一阶段不提供:
unwrapunwrap_ormapfilter- 其他链式方法
iter<T>
iter<T> 是遍历用中间类型。
方法
map(f) -> iter<U>filter(f) -> iter<T>collect() -> list<T>
其中:
map要求回调形如func(T) -> Ufilter要求回调形如func(T) -> bool
这些方法属于语言内建泛型方法,不代表语言支持用户自定义方法。
额外规则
iter<T>可用于for x in expriter<T>不支持下标访问iter<T>不建议长期保存到字段或容器中
string
string 第一阶段不提供公开点调用方法和属性。
当前稳定能力主要来自:
- 字面量:
"..."、插值字符串 - 比较:
== != < <= > >= - 作为
text(...)输入
第一阶段不提供:
- 下标访问
- 直接迭代
- 语言内建字符串方法表面
基础数值与布尔类型
以下类型第一阶段都不提供公开点调用方法和属性:
intfloatboolrune
当前稳定能力主要来自:
- 字面量
- 运算
- 比较
- 少量显式转换
any
any 第一阶段不提供普通点调用方法和属性。
它的公开表面主要来自:
- 装箱:
T -> any - 显式收窄:
x is T、x is T(v)
第一阶段不提供:
- 成员访问
- 下标访问
- 方法调用
- 普通运算
widget
widget 是抽象渲染结果类型。
第一阶段不提供公开点调用方法和属性。
它的公开表面主要来自:
- 作为
text / fragment / comment / element / main的返回类型 - 作为普通值参与赋值、传参、返回和组合