简体中文
English 简体中文 繁體中文
Methodox 首页

图和成员

一个文档包含一个或多个图,它们列在文档大纲中:文档自身的图 Document,以及位于其下的其他图。每个图都有一个种类,它决定了图的绘制方式、提供哪些节点,以及运行它意味着什么。种类名称显示在画布上方,并附有它所属的类别——Flows · dataflow、Routine · procedural——其中 dataflow(数据流)表示值沿着连线流动,节点在需要其结果时运行;procedural(过程式)表示步骤一个接一个地运行;declarative(声明式)表示图描述某样东西,而不是逐步计算它;definition(定义)则描述一个类型。

种类

种类 类别 说明
Flows dataflow 自由形式的画布。值沿着连线传递,运行时会执行标记为 active 的节点及其所依赖的一切。它是日常用于探索和组装的工作区域。
Function dataflow 可以被其他图像节点一样调用的图:一个 Input 节点、一个 Output 节点,两者之间的每个节点都会运行。
Components dataflow 以数据流定义的对象:每个没有被其他节点接收的输出都会成为该对象的一个字段,创建一个这样的对象就是运行该图。
Events procedural 由应用程序框架调用的回调——Start、每一帧的更新,以及框架提供的其余回调。
Routine procedural 按顺序执行的步骤:一个 Begin、沿执行连线排列的语句,以及 Return。循环和分支都在这里。
StateMachine declarative 由具名转换连接起来的各个状态,每个转换都由一个条件把守。每个状态的行为本身就是一个图,而状态机的数据成员是各状态共享的内容。一次运行会进入第一个状态,运行它,然后沿第一个条件成立的转换继续。
Constructs declarative 由构造函数和工厂组装而成的对象树,没有副作用——它是一份供其他图读取的描述。
Type definition 你自己的数据结构:数据成员,以及作为其方法的 Function 或 Routine 图。它不会单独运行;其他图会创建它的实例。

添加图

按 Ctrl+T,或按文档大纲中的 Add graph…。Add a graph 卡片在 Dataflow、Procedural、Declarative 和 Definition 下提供各种种类,每种都附有一句说明其用途的话。选择一种,输入 Name,然后按 Add graph;该图会被添加到文档中并打开。

Add a graph 卡片:Dataflow 下的 Flows、Function 和 Components,Procedural 下的 Events 和 Routine,Declarative 下的 StateMachine 和 Constructs,以及一个 Name 框

运行在应用程序框架上的图会一并带入该框架的包:如果将一个名为 Loop 的 Events 图添加到尚未引用该框架所属包的文档中,状态栏会显示 Added Loop and declared Event Applications。一次 Ctrl+Z 会同时撤消这两项。

在大纲中,单击某个图可显示它,右键单击它可使用 Rename…、Set as entry 和 Delete…。F2 会要求为屏幕上的图输入新名称。

入口图

入口图是文档运行开始的地方,大纲会将其标记为 entry。新文档的入口图名为 Graph,其种类即在 Choose a workload 卡片上所选的种类。右键单击另一个图并选择 Set as entry 可以移动该标记——可移至 Flows、Function、Events、Routine、StateMachine 或 Constructs 图;Components 图或 Type 永远不能作为入口。

当标签页以 Interpreted 方式运行,且屏幕上的图是 Routine、Events 图或状态机时,Run 会运行该图而不是入口图,这样就可以单独试验文档的某一部分。Compiled 运行始终从入口图开始。

Function

Function 是一个带有签名的图,其他图可以像调用节点一样调用它。

  1. 按 Ctrl+T,选择 Function,将其命名为 Twice,然后按 Add graph。它的画布上有一个 Input 节点和一个 Output 节点。
  2. 在未选择任何内容时,Properties 面板会列出 Function 的 Inputs 和 Outputs。在 Inputs 下按 Add entry:会出现一个名为 Input、类型为 Number 的条目。在其 Name 中输入 Value 并按 Enter。在 Outputs 下执行同样的操作,将其命名为 Result。条目初始为 Number;如需其他类型,请单击其 Type 并从列表中选择——常用类型排在前面,然后是文档的节点所使用的类型。
  3. 放置一个 Add(托盘中 Number Routines 下的那个),将 Input 节点的 Value 连接到它的两个输入,再将它的输出连接到 Output 节点上的 Result。
  4. 回到一个 Flows 图,按 Ctrl+Space 并输入 Twice:你的 Function 会出现在以你的文档命名的标题 Document Modules (Hello) 下。放置它,它就像其他任何节点一样接收一个 Value 并给出一个 Result。

重命名条目、更改其类型或调整其顺序都会保留其连线,并且每个调用该 Function 的节点都会随之更新。一旦本文档引用了另一个文档,就可以用同样的方式使用其中的 Function——请参阅引用。

Routine

Routine 从 Begin 开始沿着执行连线,一条语句接一条语句地运行。它的语句是带有执行引脚的节点——Print Line、Branch、各种循环——执行引脚绘制为箭头;而没有执行引脚的节点(例如 Add)会在某条语句需要其值时运行。

循环体挂在循环的 Next 引脚上,每轮运行一次;循环之后的内容挂在 Completed 上。下面这个 Routine 会打印 0、1 和 2:

  1. 创建一个入口为 Routine 的文档——在 Choose a workload 卡片上选择 General Purpose 和 Routine——或者在已有的文档中按 Ctrl+T 并选择 Routine。它一开始包含 Begin 和 Return。
  2. 按 Ctrl+Space 并输入 For:第一个候选项就是 Procedural Programming 下的循环。放置它。它按 Step 从 Start 计数到 End(两端都包含)——除非你更改,否则分别为 0、10 和 1。将 End 设为 2。
  3. 放置一个 Print Line。将 Begin 的 Next 连接到 For 的 Previous,将 For 的 Next 连接到 Print Line 的 Previous,并将 For 的 Current Value 连接到 Print Line 的 Message。
  4. 将 For 的 Completed 连接到 Return 的 Previous,然后按 F5。

一个 Routine:Begin,For 从 0 到 2,Print Line 打印当前值,然后 Return——运行后打印出 0、1 和 2

以编译方式运行时,它打印的内容相同。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 面板中——新建的图为 BasicApplication。单击它可以选择其他框架:列表会提供文档所引用的包中的框架,因此由 GUI Development 工作负载创建的文档会提供它的两个 GUI 框架。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 也可以。

  1. 单击大纲中的 Document 以显示文档自身的图。在未选择任何内容时,按 Properties 面板中的 Define data member…。(它也在托盘中,名为 Define Data Member。)

  2. Define a data member 卡片会要求输入 Name 和 Type。列表以 Number、Integer、Text 和 Truth 开头,然后是它们各自的列表和数组——List of Number、Number Array 等——再然后是 Divooka 的其余常用类型,以及文档的节点所输出或接收的类型。将其命名为 Total,选择 Number,然后按 Define。该成员的节点会被放置,托盘现在会在文档的每个图中提供 Get Total 和 Set Total。

    Define a data member 卡片:Name 为 Total,Type 列表中选中了 Number

  3. 选择该成员的节点。它的 Properties 列出其 Name、Type 和 Starting value。在 Starting value 中输入 2 并按 Enter:状态栏显示 Set starting value,节点上也会显示该值。

选中的数据成员 Total,其 Starting value 在 Properties 面板中设为 2

无论哪种模式,每次运行开始时 Total 都为 2;打印 Get Total 的 Routine 会打印 2。框旁边的叉号会将其重置为该类型的默认值。列表或数组也可以设置初始值,逐个元素设置;结构体则逐个部分设置——例如一个初始为 X 1、Y 2 的 Point。Flows 图不接受自己的数据成员;请在文档的图或某个 Type 上定义它们。

要重命名成员,请双击其节点的标题栏,或选择它并按 F2:每个读取或设置它的节点都会随之更新。