控制流与 Section 拓扑
命名节、单向跳转、子调用与返回栈
根节按源码顺序执行,跳过命名节的正文。命名节正文必须比 === Label === 更深;退回声明层级后恢复根节。声明后紧接的顶格正文也属于根节,不会被自动收入命名节。
Start() 默认只执行根节。只有命名节、根节为空的文件会直接结束;要运行某个命名节,须在根节显式跳转/调用,或由宿主指定入口。
: 故事开始。=> Greeting: 继续主线。-> end
=== Greeting === 爱丽丝: 欢迎来到这里。 -> return这里 => Greeting 会建立返回位置,-> return 回到“继续主线”。如果改用 -> Greeting,原调用栈会清空,不能再假定存在可返回的位置。
| 指令 | 语义 |
|---|---|
-> Label |
清空调用栈并跳至目标节 |
=> Label |
记录返回位置并调用目标节 |
-> return |
弹出调用帧;没有调用帧时属于控制流错误 |
-> break |
退出最近活动循环,继续其后的内容 |
-> end |
Main 根节内结束会话;Main 命名节清栈恢复其后根节点;辅助结束自身 |
命名节自然结束与其中的 -> end 行为相同,不会自动执行调用返回;需要返回就明确写 -> return。宿主也可用 Start(entryLabel: "Greeting") 指定入口,但该方式没有建立调用返回位置,上例仍需通过根节调用才可执行末尾的 return。
Forward-only 不禁止向后跳转或循环。它表示重新执行不会自动撤销之前的外部副作用;重复进入带演出或状态修饰符的拍,会再次分发这些修饰符。
上述根节恢复是 Main 规则。辅助的命名节自然结束/end 只结束自身,不寻找根节后续;jump/call/return 仍保留身份,调用也必须显式 return。Main 可用 #.track(source="Greeting", name="greeting") 令辅助进入同一节;若没有调用栈,节末不能使用 return。外部文件入口未来从目标根节开始,但显式 URL 的格式和加载协议延期。
