Notist
On this page
  1. 标量显示与有限遍历
  2. str
  3. 数组长度
  4. for 与内容连接
  5. 结构与预算

标量显示与有限遍历

使用 str 将标量转成文本,使用 for 遍历数组并生成内容。外部数据先通过 Data 解码为所需类型。

str

fn str<T: Type>(value: T) -> String;

这是普通的标准库 Rust-native 函数,T 可由静态实参类型推导,也可显式给出。只接受 Unit、Bool、Int、Float、String:

  • Unit 输出 ();Bool 输出 true/false。

  • Int 输出完整 i64 十进制,保留超过 JavaScript 安全整数范围的值,不使用 locale。

  • Float 使用最短往返十进制表示,1.0 显示为 1,负零显示为 -0;非有限值显示为 NaN、Infinity、-Infinity。

  • String 保持原文本并共享存储。HTML 仍在呈现时转义,不把文本当 HTML 或 Markup 执行。

Path、ResourceTarget、Data、DataError、Type、Content、Array、Dict、Option、Result 均不接受;Option/Result 先 match,Data 先 decode。中文布尔标签用普通分支,例如 if available { "是" } else { "否" }。

数组长度

fn count(xs: Array<Int>) -> Int { xs.len() }

数组通过 .len() 取得长度,也支持 (1, 2).len()、make_array().len()。接收者只求值一次。

for 与内容连接

fn labels(xs: Array<String>) -> InlineContent {
    for label in xs [#strong[#text(text: label)]]
}
fn directory(records: Array<Data>) -> BlockContent {
    let rows = for record in records {
        let id = data_expect<Int>(data_require<Int>(record, "id"));
        let name = data_expect<String>(data_require<String>(record, "name"));
        row()[#cell[#text(text: str(id))]#cell[#text(text: name)]]
    };
    table()[#rows]
}

Notist 与 Markdown 正文也支持 #for element in array [内容体] 或 #for element in array {代码体}。代码块仍然是 let 加尾表达式;只连接各轮返回的内容,不收集为 Array<Content>,也不自动添加空格或分段。

主体必须具有静态 Array<E> 类型,元素保持完整的 Option/Result 等名义类型。原始 Data、Dict 和擦除 Array 不可遍历。空数组通过函数的 Array<E> 参数或显式 data_decode<Array<E>> 提供元素类型,不能从第一个运行期值猜类型。

每轮必须返回同一 InlineContent 或 BlockContent;空输入得到对应类别的空贡献,模板仍接受类型和结构检查。过滤用同类别空内容,不把 Unit、none、错误隐式当作空内容。只在已有内容类别提示时接受全 Never 的模板,因为数组可能为空。

绑定是循环局部的,可以遮蔽外层同名值,退出后恢复。捕获在保存内容时固定,重复挂载不会引用最后一轮的值。集合表达式在每次挂载时求值一次,每个元素按输入顺序执行一次;构造或保存未使用的循环不读取集合、不执行模板。循环之外显式的数据 let 读取严格执行。

for 的返回值作为森林进入结果树;无属性的挂载溶解,有非空注解时保留普通透明 Group,注解覆盖整次挂载贡献,空结果也保留属性目标。显式 node 和字面量的段落/section Shape 时机保持不变。

结构与预算

table/row/list 分别接受 row/cell/item。循环体须生成符合所在位置的结构,空数组也会检查循环体。

默认 Limits.iterations 为 100000,Limits.loop_work 为 1000000;两者跨嵌套循环、内容调用和重复挂载累计,空输出也计费。另保留步骤、调用深度、内容节点、逻辑值、解析、驻留和读取额度;运行期循环嵌套最多 32 层,跨前端的语法/lowering 嵌入共用 16 层防护。输出逐轮追加,不复制已生成的整个前缀。

失败保留定义文件、调用展开链及真实数据来源;for 整体丢弃已组装的前缀,不静默跳过坏记录。未准备输入返回 NeedResources,不提供部分树,也不执行输出 hooks。comptime 不构造或遍历内容。