# 内建函数

> 

本文档收敛 Dujie 第一阶段对外可见的全局内建函数与构造形式。

渲染相关内建 `main / element / text / fragment / comment` 单独见 [渲染内建](./15.render-intrinsics)。

## 总体原则

- 这里只列语言已经公开承诺的全局内建
- 类型转换形式如 `int(x)`、`float(x)` 视为语言内建转换，不归入普通全局函数表面
- `none`、`some(...)` 是 `opt<T>` 的语言构造，不归入普通全局函数表面

## 输出函数

第一阶段稳定支持以下输出函数：

- `print(value: any) -> unit`
- `println(value: any) -> unit`
- `eprint(value: any) -> unit`
- `eprintln(value: any) -> unit`

说明：

- 这些函数主要用于调试和简单展示
- 它们接受 `any`
- 对复杂类型的具体展示文本不作为核心语言语义的一部分锁死

## `panic`

形式：

```dj
panic(message: string)
```

规则：

- 参数只接受 `string`
- 调用后不会正常返回
- 在类型检查上，允许出现在任意需要值的位置

## `assert`

`assert` 作为第一阶段内建调试能力保留。

当前用户可按以下签名理解：

- `assert(condition: bool) -> unit`
- `assert(condition: bool, message: opt<string>) -> unit`

规则：

- 第一个参数必须是 `bool`
- 第二个参数如果提供，用于附加错误信息
- 该能力主要用于开发期诊断

## `iter(...)`

`iter` 同时是内建参数化类型名和内建构造形式。

当前稳定承诺的构造形式是：

- `iter(xs: list<T>) -> iter<T>`

它的职责是把稳定容器转换成遍历管道的起点。

例如：

```dj
let xs: list<int> = [1, 2, 3];

let out = iter(xs).map(func(x: int) -> string {
    `#${x}`
}).collect();
```

第一阶段不在这里展开更多来源类型。

## 当前不归入全局内建函数的形式

以下能力虽然是语言内建，但不按普通全局函数对待：

- `text(...)`
- `fragment(...)`
- `comment(...)`
- `element(...)`
- `main`
- `int(x)` / `float(x)`
- `some(x)` / `none`

它们分别属于：

- 渲染内建
- 显式类型转换
- `opt<T>` 构造

## 相关文档

- [函数与调用](./12.functions-and-calls)
- [表达式与语句](./13.expressions-and-statements)
- [渲染内建](./15.render-intrinsics)
