跳轉到內容

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 bob@example.com $100

這是一個方言,因為它是一個可載入的 Rebol 字串。你如何解釋它取決於你,但它可以像使用多變數賦值一樣簡單

 data: load {"Bob" 21 bob@example.com $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)用於記錄的可選欄位。

華夏公益教科書