图和成员
一个文档包含一个或多个图,列在左侧的文档大纲中:文档自身的图 Document,以及位于其下的其他图。每个图都有一个种类,它决定图的绘制方式、提供哪些节点以及运行意味着什么。画布上方会显示种类及其所属的类别,例如 Flows · dataflow、Routine · procedural。其中,dataflow(数据流)表示值沿连线流动,节点在需要其结果时运行;procedural(过程式)表示各步骤依次运行;definition(定义)表示描述一个类型,而不是运行。
图的种类
| 种类 | 类别 | 说明 |
|---|---|---|
| Flows | dataflow | 一块自由形式的画布。值沿连线传递,运行时执行标记为激活的节点及其依赖的所有内容。它是日常用于探索和组装的工作区。 |
| Function | dataflow | 其他图可以像调用节点一样调用的图:有一个 Input 节点和一个 Output 节点,两者之间的每个节点都会运行。 |
| Events | procedural | 由应用程序框架调用的回调:Start、每帧调用的更新,以及框架提供的其他回调。 |
| Routine | procedural | 按顺序执行的步骤:一个 Begin、沿执行连线排列的语句,以及 Return。循环和分支都在这里。 |
| Type | definition | 你自己的数据结构:数据成员,以及作为其方法的 Function 或 Routine 图。它不会单独运行;由其他图创建它的实例。 |
添加图
按 Ctrl+T,或单击文档大纲中的 Add graph…。Add a graph 卡片将各种类分别列在 Dataflow、Procedural 和 Definition 下,每种都附有一句话说明其用途。选择一种,输入 Name,然后单击 Add graph;该图会被添加到文档中并打开。

在大纲中,单击某个图即可显示它,右键单击则可选择 Rename…、Set as entry 和 Delete…。F2 会要求为当前显示的图输入新名称。
入口图
入口图是文档运行的起点,大纲中将其标记为 entry。新文档的入口图名为 Graph,其种类为在 New document 卡片上选择的种类。右键单击另一个图并选择 Set as entry,即可将标记移到该图上;入口图可以是 Flows、Function、Events 或 Routine 图,但 Type 永远不能作为入口。当前显示的图是 Routine 或 Events 图时,Run 会改为运行该图,这样就可以单独试运行文档的某一部分。
Function
Function 是一个带有签名的图,其他图可以像使用节点一样调用它。
- 按
Ctrl+T,选择 Function,将其命名为Twice,然后单击 Add graph。它的画布上有一个 Input 节点和一个 Output 节点。 - 在未选中任何内容时,Properties 面板会列出该 Function 的 Inputs 和 Outputs。在 Inputs 下单击 Add entry:会出现一个名为 Input、类型为 Number 的条目。在其 Name 中输入
Value,然后按Enter。在 Outputs 下执行相同操作,将其命名为Result。条目的初始类型为 Number;要使用其他类型,请单击其 Type 并从列表中选择:列表先列出常用类型,然后是文档中节点所使用的类型。 - 放置一个 Add(托盘中 Number Routines 下的那个),将 Input 节点的 Value 连接到它的两个输入,然后将它的输出连接到 Output 节点上的 Result。
- 回到一个 Flows 图,按
Ctrl+Space并输入Twice:你的 Function 会出现在以文档命名的标题 Document Modules (Hello) 下。放置它后,它就像任何其他节点一样,接受一个 Value 并给出一个 Result。
重命名条目、更改其类型或调整其顺序时,连线都会保留,每个调用该 Function 的节点也会随之更新。
Routine
Routine 从 Begin 开始,沿着执行连线逐条运行语句。它的语句是带有执行引脚(以箭头绘制)的节点,例如 Print Line、Branch 和各种循环;没有执行引脚的节点(例如 Add)会在某条语句需要其值时运行。
循环体连接在循环的 Next 引脚上,每轮运行一次;循环之后的内容连接在 Completed 上。下面这个 Routine 会打印 0、1 和 2:
- 创建一个入口为 Routine 的文档(或按
Ctrl+T并选择 Routine),它一开始就带有 Begin 和 Return。 - 按
Ctrl+Space并输入For:第一个结果就是 Procedural Programming 下的循环。放置它。它按 Step 从 Start 计数到 End(包括两端),如果你不修改,这三个值分别为0、10和1。将 End 设为2。 - 放置一个 Print Line。将 Begin 的 Next 连接到 For 的 Previous,将 For 的 Next 连接到 Print Line 的 Previous,将 For 的 Current Value 连接到 Print Line 的 Message。
- 将 For 的 Completed 连接到 Return 的 Previous,然后按
F5。

Return 无论在何处被执行到,都会结束 Routine:如果改为将它连接在循环体内的 Print Line 之后,程序会打印 0 后停止。一个 Routine 可以有多个 Return。
局部变量
Routine 在运行时可以保存自己的值。在未选中任何内容时,单击 Properties 面板中的 Define local variable…(或在托盘中查找 Define Local Variable),为其命名并选择类型。之后托盘会为它提供 Get 和 Set 节点。每次调用 Routine 时,该变量都会从其初始值开始,如果没有初始值,则从其类型的默认值开始。
Events
Events 图是应用程序框架上的一组回调:你放置框架的事件(Start 以及框架提供的其他事件),并在其后连接语句,由框架决定每个事件何时运行。使用哪个框架由图的 Procedural base type 决定,在未选中任何内容时显示在 Properties 面板中,新建的 Events 图为 BasicApplication。单击它可以选择其他框架,例如用于带按钮窗口的框架,或用于带帧循环游戏的框架。Events 图可以包含自己的 Function 和 Routine,供其回调调用:在未选中任何内容时,单击其 Properties 中的 Define behavior member…。GUI 和 Glaze 类别中的示例很值得打开看看,请参阅示例。
Type
Type 定义一个数据结构:它的数据成员,以及其中作为方法的 Function 或 Routine 图。其他图使用它的 Make 节点(对于名为 Point 的 Type,即 Make Point)创建实例,并读取和设置其成员。在其画布上未选中任何内容时,Properties 面板中的 Type kind 用于在以下几种之间选择:Class,由所有持有它的对象共享;Struct,一个会被复制的值;Record,由其成员一次性构建,之后不再更改。
数据成员和初始值
数据成员是属于某个类型、并在多次调用之间保持不变的值,例如累计总数、分数或设置。文档本身就是一个类型,因此它自身的图 Document 可以包含供其中所有图共享的数据成员,Type 也可以包含数据成员。
单击大纲中的 Document,显示文档自身的图。在未选中任何内容时,单击 Properties 面板中的 Define data member…。(托盘中也有,名为 Define Data Member。)
Define a data member 卡片会要求输入 Name 和 Type。列表先列出 Number、Integer、Text 和 Truth,然后是它们各自的列表和数组(List of Number、Number Array 等),再往后是 Divooka 的其他常用类型,以及文档中节点输出或接受的类型。将其命名为
Total,选择 Number,然后单击 Define。画布上会放置该成员的节点,此后托盘会在文档的每个图中提供 Get Total 和 Set Total。
选中该成员的节点。其 Properties 列出它的 Name、Type 和 Starting value。在 Starting value 中输入
2并按Enter:状态栏显示 Set starting value,节点上也会显示该值。

每次运行开始时,Total 都为 2;打印 Get Total 的 Routine 会打印 2。框旁边的叉号可将其重置为类型的默认值。列表或数组也可以设置初始值,逐个元素设置;结构体则逐个部分设置,例如初始值为 X 1、Y 2 的 Point。Flows 图不能拥有自己的数据成员;请在文档的图或 Type 上定义它们。
要重命名成员,请双击其节点的标题栏,或选中它并按 F2:所有读取或设置它的节点都会随之更新。