# 内建结构体与运行时类型

> 

本文档说明 Dujie 第一阶段哪些内建名字会形成用户可见的运行时值，以及哪些东西不是“内建结构体”。

## 当前没有公开内建 `struct`

第一阶段语言不提供用户可直接命名、构造和字段访问的公开内建 `struct`。

也就是说，当前这些都不存在：

- 类似 `Option`、`Result` 这样的公开内建结构体
- 渲染节点对应的公开结构体
- 宿主属性对应的公开结构体

用户可见的具名结构体一律来自用户自己声明的 `struct`。

## 内建类型不等于内建结构体

以下名字是语言内建类型，但不是公开内建 `struct`：

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

它们各自有语言级语义，但不暴露为用户可解构的内建结构体定义。

## `opt<T>` 的运行时值形态

`opt<T>` 的用户可见运行时值形态只有：

- `none`
- `some(value)`

规则：

- `none` 是空值形态
- `some(value)` 是非空值形态
- 它们是语言构造，不是公开结构体构造
- 当前也不暴露类似 `Option<T> { ... }` 这样的命名结构

## `unit`

`unit` 是正式类型，但不提供单独的公开字面量或结构体形式。

它主要出现在：

- 无返回值函数的返回类型
- 没有尾表达式的 block 结果类型

## `iter<T>`

`iter<T>` 是内建参数化类型，同时配有内建构造形式 `iter(xs)`。

但它不作为用户可字段访问的公开结构体暴露。

第一阶段只保证：

- 它可以出现在类型位置
- 它可作为 `for` 与 `map/filter/collect` 的承载值

## `widget`

`widget` 是抽象渲染结果类型，不公开其内部节点结构。

这意味着：

- 用户可以持有 `widget`
- 可以把 `widget` 传递、返回、放进容器
- 但不能把它当结构体去字段访问或解构

## 渲染内建不是结构体

以下名字属于渲染内建，不属于公开内建结构体：

- `main`
- `element`
- `text`
- `fragment`
- `comment`

它们要么是入口 intrinsic，要么是渲染树构造 intrinsic。

## `func`

`func` 是函数声明和匿名函数表达式的语法形式，不是公开运行时结构体类型。

第一阶段也不把完整函数值系统作为公开类型系统展开。

## 相关文档

- [类型系统总纲](./09.type-system)
- [表达式与语句](./13.expressions-and-statements)
- [渲染内建](./15.render-intrinsics)
