内建结构体与运行时类型

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

当前没有公开内建 struct

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

也就是说,当前这些都不存在:

  • 类似 OptionResult 这样的公开内建结构体
  • 渲染节点对应的公开结构体
  • 宿主属性对应的公开结构体

用户可见的具名结构体一律来自用户自己声明的 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)

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

第一阶段只保证:

  • 它可以出现在类型位置
  • 它可作为 formap/filter/collect 的承载值

widget

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

这意味着:

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

渲染内建不是结构体

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

  • main
  • element
  • text
  • fragment
  • comment

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

func

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

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

相关文档