跳转到内容

Rebol 编程/语言特性/方言

来自维基教科书,开放的书籍,面向开放的世界

Rebol 的强大功能很大程度上来自它的方言概念。方言是用于特定目的的子语言(也称为领域特定语言)。

无处不在

[编辑 | 编辑源代码]

这就像买一辆大众甲壳虫。一旦你拥有了一辆,你就会发现它们无处不在。方言也是如此。更棒的是,一旦你知道了它们是什么,你就可以开始将它们添加到你的代码中,并使用它们来获得更大的编程优势,从而编写应用程序。

你在 Rebol 中经常使用方言,即使你可能没有意识到。例如,当你写

sum: func [num1 [number!] num2 [number!]] [num1 + num2]

紧随func关键字之后的代码块实际上是一个方言。它不是“正常的 Rebol 代码”(也称为 Do 方言),而是一种特殊的语言,用于定义函数的参数。

类似地,当你创建 GUI 时,你经常会在 VID(视觉界面方言)中编写它。VID 的片段可能看起来像这样

image %nice-graphic.jpg
button "Go" [do something]
button "Stop" [quit]
the-field: area "Enter text here"

你可能没有意识到,但当你告诉parse函数如何解析字符串或代码块时,你也在使用方言

thru <title> copy title to </title>

当你想要控制程序的安全时,你也会使用方言

net allow
file [
    ask all
    allow read
    quit execute
]
shell quit

因此,Rebol 中有许多这样的方言。

方言定义

[编辑 | 编辑源代码]

Rebol 中方言的定义非常简单:任何可加载的表达式都是一个方言

也就是说,要使方言有效,你必须能够使用load函数将它加载到 Rebol 中。方言必须是 Rebol 的有效词法表达式。如果一个字符串无法加载,那么它就不是方言(它可能是一种有效的语言,但它只是不是方言)。

例如,这段代码表明给定的字符串是 Rebol 的有效方言,因为它可以加载

>> load {sell 100 shares "aacmee" now}
== [sell 100 shares "aacmee" now]

但是,下面的示例不是有效的方言。它无法加载。

>> load {move 100-200 draw @line}
** Syntax Error: Invalid date -- 100-200

同样,这行 C 代码也不是有效的方言

>> load {for (i = 1; i < 10; i++) print(i);}
** Syntax Error: Missing ) at end-of-script

这些示例包含在 Rebol 中无效的字符序列;因此,它们不是 Rebol 的方言。

这种可加载性因素是使 Rebol 中的方言如此特别的原因之一。你不需要编写词法字符串扫描器。你可以跳过这一部分,直接进入你的特殊语言的精髓。

不仅是代码,还有数据

[编辑 | 编辑源代码]

方言不仅对代码表达式有用,对数据存储(以及通过网络交换数据)也同样有效率。

重要的是要认识到,方言并不需要你编写解析器或任何其他复杂的方法来解释数据的含义。即使像这样简单的代码块也被认为是一个方言

 "Bob" 21 [email protected] $100

这是一个方言,因为它是一个可加载的 Rebol 字符串。你如何解释它取决于你,但它可以像使用多变量赋值一样简单

 data: load {"Bob" 21 [email protected] $100}
 set [name age email payment] data

这里是一个更复杂的数据方言,用于存储 Rebol 基于的班级聚会程序中有关学生的信息。这只是一条记录,但我们将其拆分为单独的行,以便你看到详细信息

37 "Bob" "Smith" "1000 Example Dr." "Example" "CA" "90000"
spouse "Linda Smith"
phone "555-1234"
package [all 2 true]
paid $70.00
bio {I went to school for Industrial Instrumentation.}
approve [book-name book-bio]

此方言中的单词(如 spouse、phone、package)用于记录的可选字段。

华夏公益教科书