# 内建类型表面

> 

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

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

## 总体原则

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

也就是说，像 `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 T`、`x is T(v)`

第一阶段不提供：

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

## `widget`

`widget` 是抽象渲染结果类型。

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

它的公开表面主要来自：

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

## 相关文档

- [类型系统总纲](./09.type-system)
- [泛型系统](./10.generics-system)
- [表达式与语句](./13.expressions-and-statements)
- [渲染内建](./15.render-intrinsics)
- [Any 设计](./16.any-design)
