REBOL

REBOL（發音reb-ol 'reb-ol，英文Relative Expression Based Object Language的縮寫），自R3發行版改稱為Rebolarchive-url=https://web.archive.org/web/20201202131330/http://www.rebol.com/article/0526.html，是跨平臺的數據交換語言和多範型的動態編程語言。由AmigaOS的系統架構師Carl Sassenrath設計，用於網絡通信和分佈式計算。

**簡介**
REBOL介入了方言化的概念：用於代碼和數據的小型的、優化的領域特定語言，據設計者所說這是這個語言最顯著的性質：“儘管它可以用於編程、寫函數和進行處理，它最大的長處是輕易的建立領域特定語言或方言的能力。”
知名於JavaScript開發上貢獻的道格拉斯·克羅克福特，曾經描述Rebol為是對JSON有影響者之一：“更加現代的語言，但具有一些非常類似於Lisp的想法，它全部建造在數據表示之上，然後再被作為程序執行。”
最初，這個語言和它的官方實現，是REBOL技術公司開發的專有和封閉源代碼的軟件。經過跟Lawrence Rosen的討論，Rebol版本R3解釋器於2012年12月12日在Apache 2.0許可證下發行。老版本能以二進制形式獲得到，沒有發行它們的源代碼的規劃。
Rebol已經被用於編程互聯網應用（client-side和server-side二者）、數據庫應用、實用工具和多媒體應用。

**實例**
Rebol的設計原理之一就是“以簡單方式做簡單的事情”。使用下面的“可視界面方言”例子來描述一個具有圖形用戶界面的簡單的Hello world程序：
view layout text "Hello world!" button "Quit" quit
使用R3-GUI的類似的例子：
view text "Hello world!" button "Quit" on-action quit
R3-GUI Hello world example

**方言**
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，它是空格分隔的三個單詞。
註釋可以出現在分號之後直到行結束。多行註釋或不被詞法分析器忽略的註釋，可以使用平常的數據類型比如多行字符串來書寫。

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

**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函數。圓括號可以用來改變求值的次序。使用前綴表示法，可以避免使用圓括號。
這種簡單的優先級規則有如下優勢：- 不需要在寫表示式的時候查看優先級表格，- 不需要在定義新算符的時候重寫優先級表格，- 表達式可以輕易的從中綴轉寫成前綴表示法或反之。
還有一個劣勢：
*習慣了常規優先級規則的用戶容易出錯。

**parse**
parse函數適合用於規定、驗證、變換和解釋方言。它通過在運行時間匹配“解析表達式”來完成工作。
“解析表達式”是使用“解析方言”來書寫的，它類似於“執行方言”，是“數據交換方言”的面向表達式的子語言。不同於“執行方言”，“解析方言”使用關鍵字來代表算符和大多數重要的非終結符，中綴分析算符沒有前綴等價者並使用優先級規則（序列優先於選擇）。
動作也可以被包含而在解析處理期間進行，並且parse函數可以被用來處理塊或字符串。在“字符串解析”層級，parse必須處理“低層”解析，需要考慮到字符和delimiter。“塊解析”是更高層級，處理在Rebol值的級別上的掃描。
解析方言屬於由top-down parsing language或解析表達文法（PEG）為代表的文法家族。主要的類似性是所有家族成員都有序列和選擇算符的出現。解析方言的語法和在解析方言和PEG之間的類似性可以用分析算術表達式的PEG示例的如下轉寫來展示：
Digit: charset #"0" - #"9"
Value:  "(" Expr ")"
Product: Value any  "/" Value
Sum: Product any  "-" Product
Expr: Sum
parse/all "12+13" Expr

**引用**

**延伸閱讀**
 archive-date=March 24, 2005- cite news|last=Story|first=Derrick|title=Rebol Might Be the Language for the Rest of Us|url=http://webreview.com/pub/1999/08/27/feature/index.html|newspaper=Web Review|date=Aug 27, 1999|archive-url=https://web.archive.org/web/19991012182529/http://webreview.com/pub/1999/08/27/feature/index.html |archive-date=October 12, 1999

**外部鏈接**
 REBOL-  A REBOL tutorial date=20210301001217 -  Rebol 3 Tutorial date=20210130011136