REBOL

REBOL（發音 reb-ol 'reb-ol，英文 Relative Expression Based Object Language 的縮寫），自 R3 發行版改稱為 Rebol，是跨平臺的資料交換語言和多範型的動態程式語言。由 AmigaOS 的系統架構師設計，用於網路通訊和分散式計算。

簡介

REBOL 介入了方言化的概念：用於程式碼和資料的小型的、的領域特定語言，據設計者所說這是這個語言最顯著的性質：“儘管它可以用於程式設計、寫函式和進行處理，它最大的長處是輕易的建立領域特定語言或方言的能力。”

知名於 JavaScript 開發上貢獻的道格拉斯・克羅克福特，曾經描述 Rebol 為是對 JSON 有影響者之一：“更加現代的語言，但具有一些非常類似於 Lisp 的想法，它全部建造在資料表示之上，然後再被作為程式執行。”

最初，這個語言和它的官方實現，是 REBOL 技術公司開發的專有和封閉原始碼的軟體。經過跟的討論，Rebol 版本 R3 直譯器於 2012 年 12 月 12 日在 Apache 2.0 許可證下發行。老版本能以二進位制形式獲得到，沒有發行它們的原始碼的規劃。

Rebol 已經被用於程式設計網際網路應用（和二者）、資料庫應用、實用工具和多媒體應用。

例項

Rebol 的設計原理之一就是 “以簡單方式做簡單的事情”。使用下面的 “可視介面方言” 例子來描述一個具有圖形使用者介面的簡單的 Hello world 程式：

view layout text "Hello world!" button "Quit" quit

使用 R3-GUI 的類似的例子：

view text "Hello world!" button "Quit" on-action quit

方言

Rebol 的領域特定語言叫做 “方言”，是為特定用途最佳化的微型語言。方言可以用來定義業務規則、圖形使用者介面或在程式安裝期間的螢幕序列。使用者可以定義他們自己的方言，重用任何現存的 Rebol 單詞並給予它在方言中的特殊含義。方言是有處理 Robol 塊的函式以特殊方式解釋的。

Rebol 的方言能力的例子可以從單詞 return 看出來。在 “資料交換方言” 中 return 就是個沒有任何特殊含義的單詞。在 “執行方言” 中，return 是個全域性變數，指稱傳遞迴一個函式結果值的一個原生函式 。在 “可視介面方言”（VID）中 return 是一個關鍵字，導致佈局引擎去模擬一個回車返回，移動 “呈現筆” 下至下一行的開始處。

具有圖形能力的 Rebol 直譯器必須理解和解釋很多方言。下表按重要性依次列出最主要的方言。

語法

Rebol 的是自由形式的，不要求特殊定位。但是，通常使用縮排來更好將文字結構傳達給人類讀者。

不同方言的語法屬性可以不同。對於所有 Rebol 方言的公共平臺是 “資料交換方言”；其他方言通常從它派生。除了是所有方言的公共平臺之外，“資料交換方言” 直接用來表示資料和元資料、遷移（populate）資料結構，在網際網路上傳送資料，並把它們儲存在資料儲存中。

對比於程式語言比如 C，“資料交換方言” 不構成自、語句、或關鍵字。有效的 “資料交換方言” 文字流是樹資料結構，構成自塊（根塊是隱含的，子塊由方括號），圓塊（圓括號界定）、字串（雙引號或適用多行字串的花括號來界定；脫字元表示法用於不可列印字元）、URL、e-mail 地址、檔案、路徑或其他複合值。不同於 ALGOL 的塊，Rebol 的塊是複合（composite）值，類似於 Lisp 中引用起來的表示式。程式碼以 Rebol 塊的形式寫成的事實，使語言具有同像性。

塊還有圓塊可以包含由空白分隔的其他複合值（一個塊可以包含子塊、圓塊、字串等等) 或標量值比如：word（單詞）、set-word（字尾著冒號的單詞）、get-word（字首著冒號的單詞）、lit-word（字首著撇號的單詞），數字、錢款、字元等。注意在單詞中允許特殊字元，所以 a+b 是一個單詞，不同於 a + b，它是空格分隔的三個單詞。

語義

塊包含領域特定語言，它可以作為實際引數提交給特定的 “求值器” 函式。

5.1 do

最常用的求值器是 do 函式。它被預設的用來解釋給直譯器控制檯的文字輸入。

由 do 函式解釋的 “執行方言”，是一個的 “資料交換方言” 的子語言。語言的主要語義單元是。對比於派生自 ALGOL 的指令式程式語言，“執行方言” 既沒有關鍵字也沒有語句。

單詞被用作大小寫不敏感變數。像在所有動態型別語言中那樣，變數沒有關聯的型別，型別是關聯於值的。在 do 函式遇到一個單詞的時候，返回對這個單詞的求值結果。set-word 單詞可以用於賦值。儘管沒有語句，賦值和有副作用的函式在一起，可以用於指令式程式設計。

根塊的子塊自行用 do 求值。塊作為直譯器實際引數這個性質被用來處理資料塊，透過把塊作為實際引數提交給控制函式如 if、either、loop 等用於結構化程式設計，在把塊傳遞給特定直譯器函式時用於方言。

值得注意的特殊問題是賦值給變數的複合值是不復制的。要製作一個複本，這個值必須傳遞給 copy 函式。

do 函式通常服從字首表示法求值，這裡函式處理跟隨在其後的實際引數。但是，也存在使用中綴的中綴求值。中綴求職優先於字首求值。例如：

abs -2 + 3

返回 1，因為中綴加法優先於計算絕對值。在求值中綴表示式的時候，求值的次序是從左至右，沒有算符優先於其他算符。例如

2 + 3 * 4

返回 20，對於乘法優先於加法的求值這將產生 14。所有演算法都有字首版本。Do 在將實際引數傳遞給函式之前通常對實際引數進行求值。所以，下列表達式：

print read http://en.wikipedia.org/wiki/Rebol

首先讀取維基百科的 Rebol 頁面，接著把結果傳遞給 print 函式。圓括號可以用來改變求值的次序。使用字首表示法，可以避免使用圓括號。

這種簡單的優先順序規則有如下優勢：

不需要在寫表示式的時候檢視優先順序表格，
不需要在定義新算符的時候重寫優先順序表格，
表示式可以輕易的從中綴轉寫成字首表示法或反之。

還有一個劣勢：

習慣了常規優先順序規則的使用者容易出錯。

5.2 parse

parse 函式適合用於規定、驗證、變換和解釋方言。它透過在執行時間匹配 “解析表示式” 來完成工作。

“解析表示式” 是使用 “解析方言” 來書寫的，它類似於 “執行方言”，是 “資料交換方言” 的面向表示式的子語言。不同於 “執行方言”，“解析方言” 使用關鍵字來代表算符和大多數重要的非終結符，中綴分析算符沒有字首等價者並使用優先順序規則（序列優先於選擇）。

動作也可以被包含而在解析處理期間進行，並且 parse 函式可以被用來處理塊或字串。在 “字串解析” 層級，parse 必須處理 “低層” 解析，需要考慮到字元和。“塊解析” 是更高層級，處理在 Rebol 值的級別上的掃描。

解析方言屬於由或解析表達文法（PEG）為代表的文法家族。主要的類似性是所有家族成員都有序列和選擇算符的出現。解析方言的語法和在解析方言和 PEG 之間的類似性可以用分析算術表示式的 PEG 示例的如下轉寫來展示：

Digit: charset #"0" - #"9"

Value: "(" Expr ")"

Product: Value any "/" Value

Sum: Product any "-" Product

Expr: Sum

parse/all "12+13" Expr