Rebol

**REBOL**（發音 **reb-ol** ['reb-ol]，英文 **R**elative **E**xpression **B**ased **O**bject **L**anguage 的縮寫），自 R3 發行版改稱為 **Rebol**，是跨平台的資料交換語言和多範式的動態程式語言。由 AmigaOS 的系統架構師 Carl Sassenrath 設計，用於網路通信和分散式計算。

## 簡介

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

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

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

Rebol 已經被用於編程網際網路應用（客戶端和伺服器端二者）、資料庫應用、實用工具和多媒體應用。

## 實例

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

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

## 方言

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

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

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

## 語法

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

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

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

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

注釋可以出現在分號之後直到行結束。多行注釋或不被詞法剖析器忽略的注釋，可以使用平常的資料類型比如多行字串來書寫。

## 語意

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

### do

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

由 `do` 函式解釋的「執行方言」，是一個面向表達式的「資料交換方言」的子語言。語言的主要語意單元是表達式。對比於衍生自 ALGOL 的指令式程式語言，「執行方言」既沒有關鍵字也沒有語句。

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

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

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

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

```
abs -2 + 3
```

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

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

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

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

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

還有一個劣勢：

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

### parse

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

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

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

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

## 參照

## 延伸閱讀

* Mikes, Nora. A REBOL incursion: It's not a scripting language, not a programming language -- and not a new Amiga, either. Or is it?. LinuxWorld. November 20, 1999. （原始內容存檔於 March 24, 2005）.
* Story, Derrick. Rebol Might Be the Language for the Rest of Us. Web Review. Aug 27, 1999. （原始內容存檔於 October 12, 1999）.

## 外部連結

* 開放目錄專案中的「REBOL」
* A REBOL tutorial （頁面存檔備份，存於網際網路檔案館）
* Rebol 3 Tutorial （頁面存檔備份，存於網際網路檔案館）