Notist
On this page
  1. Types & Literals
  2. 不返回的类型
  3. 标量
  4. String
  5. Path 与资源目标
  6. 外部结构化数据
  7. 内容
  8. 集合
  9. 函数

Types & Literals

lex Digit -> [`0`-`9`];
lex Number -> Digit+ (`.` Digit+)?;

不返回的类型

Never 不含任何值,表示不能正常返回;不是 Unit,也没有运行期字面量。控制流与诊断见 Never 与 panic。

标量

  • Unit — 唯一值 ()

    syntax Unit -> LPAREN RPAREN;
  • Bool — true / false

    syntax Bool -> `true` | `false`;
  • Int — i64 十进制

  • Float — f64 十进制(0.5;.5、1. 不合法)

    syntax NumericValue -> MINUS? NUMBER;

数字无科学计数法;负号与 NUMBER 必须紧邻,形成 Neg 节点,不属于 Number token。Markup 数据字面量使用该前缀,Code 表达式另支持一元负号与 Bool 取反。整数溢出由 pipeline.lowering 的字面量转换产生 semantic 诊断。

String

UTF-8,四种形态,产出同一类型:

  • "..." — 行内,转义

  • """...""" — 多行,转义

  • r#"..."# — raw 行内(# 层级 ≥1,任意)

  • r#"""..."""# — raw 多行

转义集恰好五个:\" \\ \n \r \t;raw 形态不处理转义。行内形态不跨行。多行形态:开引号后须立即换行(该换行不计入值),收尾去掉一个换行,不做 dedent。

String 由 Code、原生 Markup 与 Markdown 扩展参数共享的字面量扫描器识别为一个 STR token,字符串中的标点不参与外层括号平衡。raw 的闭界定符使用与开界定符相同数量的 #;多行形式使用三个引号。字符串的值转换和非法转义诊断由对应的字面量 lowering 执行;文档中由结果构造描述。

Path 与资源目标

p"./image.svg" 产生 Path,按字面量所在源文件和宿主逻辑根绑定资源身份。Path 可转发、比较并保存在集合中,但不与 String 隐式转换,也不会自动读取或发布文件。语义和示例见 Path 字面量。

ResourceTarget 是接受 Path 或 String 的输入类型,用于 embed 及转发它的函数;不新增运行期值种类。embed 将本地 URL 字符串兼容转换为已绑定的 Path,远程 URL 保持 String。普通 String 参数不接受 Path;link 通过泛型和 where 约束接受两者,不发生隐式转换。

外部结构化数据

Data 表示 JSON/TOML 的只读数据视图,DataError 表示读取或访问错误。读取、解码与错误处理见 Data 与 JSON/TOML。

内容

[...] 在调用后的 body 槽挂载为 children;#node[...] 是显式 node 调用。其正文使用所在前端的语法:.not 使用 Notist Markup,.md / .markdown / .notmd / .nmd 使用 Markdown 及其 Notist 扩展,见 文档前端。flank(两端内侧有无空白)决定 flavor:

  • [x](两端内侧未同时留白)→ InlineContent — inline 序列,所在前端的行内文法

  • [ x ](两端内侧均为空白或换行)→ BlockContent — 文档内容(调用森林),所在前端的块级文法;不透明:无相等性、不可模式匹配

flavor(open, close) =
  BlockContent if kind(open + 1) in {Whitespace, Newline}
             and kind(close - 1) in {Whitespace, Newline}
  else InlineContent

仅一端留白或内部跨行不会自行声明 BlockContent;空 [] 为 InlineContent。

内容只通过调用后的 body 槽挂载;#node[...] 对应透明的 node 调用,渲染为内容本身,可承接注解。flank 空白不属于内容;inline 声明的内容不允许空行(诊断并按软换行吸收)。Code 的独立内容字面量解析入口见 文档前端,同样用于 .notc 函数体。

InlineContent 与 BlockContent 没有隐式转换。固定 BlockContent 参数需要块级字面量;类别多态的参数通过输入类型推导编译期类别。node 保持输入类别,callout、item、cell 接受两种输入并固定返回 BlockContent。

Code 的内容值是森林;字面量内 #value 求值后直接引入结果森林。插值带有非空属性时保留透明 Group,作为这次挂载的属性落点,包括结果为空的情况;无属性和空注解不额外保留分组。显式 node 与原生内容元素仍有自己的节点。详情见 Code 函数系统。

集合

  • Array — 有序不可变:(1, 2, 3);单元素须尾逗号 (1,);空 (,)

  • Dict — 有序不可变:("k": v);裸标识符 key 是字符串 key 的糖;空 (:);重复 key 后者覆盖、位置不动

  • Option<T> — 可选数据值:some(v) 携带载荷 T,none 表示缺席;some 按载荷判等,none == none,与 T 不同型。边界与分解规则见 Option 类型

  • Result<T, E> — 可失败的数据结果:ok(v) 携带 T,err(e) 携带 E;错误值不自行抛出,使用 match 显式处理。构造、类型上下文与覆盖规则见 Result 类型

集合字面量判别完全局部:出现 k: v 项 → Dict;否则出现逗号 → Array;否则为 grouping((x) 永远不是集合,() 是 Unit)。

syntax ArgKey -> IDENT | STR;
syntax Value -> STR | NumericValue | Bool | Collection;
syntax Collection ->
  Unit | `(` `:` `)` | `(` `,` `)`
  | LPAREN Trivia* Member (Trivia* COMMA Trivia* Member)* Trivia* COMMA?
    Trivia* RPAREN;
syntax Member -> ArgKey COLON Trivia* Value | Value;
syntax Dict -> value:Collection @{ classification(value) == Dict };

classification 按上面的局部判别执行。Grouping 必须恰有一个值;Dict 中的游离值产生 semantic 诊断。Trivia 与 Args 使用 Syntax 中的规则;当前 parser 对缺失 / 重复逗号的容错也适用于集合。

Dict 的 key 为字符串,可以写成标识符或字符串字面量。

BlockContent 不属于可传入普通参数的 Value。#f([body]) 与 #f(children: [body]) 目前不支持;内容用 #f(args)[body] 挂载。parser 可保留非法位置的内容语法供诊断和恢复。裸标识符值除 true / false 外产生 semantic 诊断。

函数

.not 与 Markdown 扩展都提供内容函数调用;.notc 提供原生签名声明与纯函数定义,语法见 Code Syntax。当前没有 Function 值或闭包字面量,函数体和求值规则见 Code 函数系统。