REBOL
編程範型 | 面向語言, 數據交換, 同像性, 指令式, 函數式, 基於原型 |
---|---|
設計者 | Carl Sassenrath |
實作者 | REBOL技術 |
面市時間 | 1997年 |
當前版本 |
|
型態系統 | 動態, 強類型 |
操作系統 | 跨平台 |
許可證 | 2.7.8為免費重新發布軟件[1], R3為Apache 2.0許可證[2] |
文件擴展名 | .r, .reb[3] |
網站 | www |
啟發語言 | |
Self, Forth, Lisp, Logo[4] | |
影響語言 | |
JSON[5], Red | |
|
REBOL(發音reb-ol ['reb-ol],英文Relative Expression Based Object Language的縮寫),自R3發行版改稱為Rebol[6],是跨平台的數據交換語言和多范型的動態編程語言。由AmigaOS的系統架構師Carl Sassenrath設計,用於網絡通信和分布式計算。
簡介
[編輯]REBOL介入了方言化的概念:用於代碼和數據的小型的、優化的領域特定語言[7][8],據設計者Carl Sassenrath所說這是這個語言最顯著的性質:「儘管它可以用於編程、寫函數和進行處理,它最大的長處是輕易的建立領域特定語言或方言的能力。[9]」
知名於JavaScript開發上貢獻的道格拉斯·克羅克福特,曾經描述Rebol為是對JSON有影響者之一:「更加現代的語言,但具有一些非常類似於Lisp的想法,它全部建造在數據表示之上,然後再被作為程序執行。[5]」
最初,這個語言和它的官方實現,是REBOL技術公司開發的專有和封閉源代碼的軟件。經過跟Lawrence Rosen的討論[10],Rebol版本R3解釋器於2012年12月12日在Apache 2.0許可證下發行[11]。老版本能以二進制形式獲得到,沒有發行它們的源代碼的規劃。
Rebol已經被用於編程互聯網應用(客戶端和服務器端二者)、數據庫應用、實用工具和多媒體應用[7]。
實例
[編輯]Rebol的設計原理之一就是「以簡單方式做簡單的事情」[7]。使用下面的「可視界面方言」例子來描述一個具有圖形用戶界面的簡單的Hello world程序:
view layout [text "Hello world!" button "Quit" [quit]]
使用R3-GUI的類似的例子:
view [text "Hello world!" button "Quit" on-action [quit]]
方言
[編輯]Rebol的領域特定語言叫做「方言」,是為特定用途優化的微型語言。方言可以用來定義業務規則、圖形用戶界面或在程序安裝期間的屏幕序列。用戶可以定義他們自己的方言,重用任何現存的Rebol單詞並給予它在方言中的特殊含義[7]。方言是有處理Robol塊的函數以特殊方式解釋的。
Rebol的方言能力的例子可以從單詞return
看出來。在「數據交換方言」中return
就是個沒有任何特殊含義的單詞。在「執行方言」中, return
是個全局變量,指稱傳遞迴一個函數結果值的一個原生函數[4] 。在「可視界面方言」(VID)中return
是一個關鍵字,導致布局引擎去模擬一個回車返回,移動「呈現筆」下至下一行的開始處[8]。
具有圖形能力的Rebol解釋器必須理解和解釋很多方言。下表按重要性依次列出最主要的方言。
方言名字 | 解釋於 | 用途 |
---|---|---|
數據交換方言 | load 函數
|
表示數據和元數據;Rebol方言的共用平台 |
執行方言 | do 函數
|
編程 |
解析方言 | parse 函數
|
模式匹配 |
函數規定方言 | make 函數
|
函數定義;函數式編程 |
對象規定方言 | make 函數
|
對象定義/繼承;基於原型編程 |
可視界面方言或 RebGUI |
layout 函數或display 函數
|
指定圖形用戶界面 |
繪圖方言 | view 函數
|
定義圖形元素(直線、多邊形等) |
腳本規定方言 | do 函數
|
腳本定義 |
安全政策方言 | secure 函數
|
指定安全政策 |
語法
[編輯]Rebol的語法是自由形式的,不要求特殊定位。但是,通常使用縮進來更好將文本結構傳達給人類讀者。
不同方言的語法屬性可以不同。對於所有Rebol方言的公共平台是「數據交換方言」;其他方言通常從它派生。除了是所有方言的公共平台之外,「數據交換方言」直接用來表示數據和元數據、遷移(populate)數據結構,在互聯網上發送數據,並把它們保存在數據存儲中。
對比於編程語言比如C,「數據交換方言」不構成自聲明、語句、表達式或關鍵字。有效的「數據交換方言」文本流是樹數據結構,構成自塊(根塊是隱含的,子塊由方括號界定),圓塊(圓括號界定)、字符串(雙引號或適用多行字符串的花括號來界定;脫字符表示法用於不可打印字符)、URL、e-mail地址、文件、路徑或其他複合值。不同於ALGOL的塊,Rebol的塊是複合(composite)值,類似於Lisp中引用起來的表達式。代碼以Rebol塊的形式寫成的事實,使語言具有同像性[4]。
塊還有圓塊可以包含由空白分隔的其他複合值(一個塊可以包含子塊、圓塊、字符串等等)或標量值比如:word
(單詞)、set-word
(後綴着冒號的單詞)、get-word
(前綴着冒號的單詞)、lit-word
(前綴着撇號的單詞)[12],數字、錢款、字符等。注意在單詞中允許特殊字符,所以a+b
是一個單詞,不同於a + b
,它是空格分隔的三個單詞。
注釋可以出現在分號之後直到行結束。多行注釋或不被詞法分析器忽略的注釋,可以使用平常的數據類型比如多行字符串來書寫[4]。
語義
[編輯]塊包含領域特定語言,它可以作為實際參數提交給特定的「求值器」函數[7]。
do
[編輯]最常用的求值器是do
函數。它被缺省的用來解釋給解釋器控制台的文本輸入。
由do
函數解釋的「執行方言」,是一個面向表達式的「數據交換方言」的子語言。語言的主要語義單元是表達式。對比於派生自ALGOL的指令式編程語言,「執行方言」既沒有關鍵字也沒有語句。
單詞被用作大小寫不敏感變量。像在所有動態類型語言中那樣,變量沒有關聯的類型,類型是關聯於值的。在do
函數遇到一個單詞的時候,返回對這個單詞的求值結果。set-word
單詞可以用於賦值。儘管沒有語句,賦值和有副作用的函數在一起,可以用於指令式編程[4]。
根塊的子塊自行用do
求值。塊作為解釋器實際參數這個性質被用來處理數據塊,通過把塊作為實際參數提交給控制函數如if
、either
、loop
等用於結構化編程,在把塊傳遞給特定解釋器函數時用於方言[7]。
值得注意的特殊問題是賦值給變量的複合值是不複製的。要製作一個複本,這個值必須傳遞給copy
函數[4]。
do
函數通常服從前綴表示法求值,這裡函數處理跟隨在其後的實際參數。但是,也存在使用中綴算符的中綴求值。中綴求職優先於前綴求值。例如:
abs -2 + 3
返回1
,因為中綴加法優先於計算絕對值。在求值中綴表達式的時候,求值的次序是從左至右,沒有算符優先於其他算符。例如
2 + 3 * 4
返回20
,對於乘法優先於加法的求值這將產生14。所有算法都有前綴版本。Do
在將實際參數傳遞給函數之前通常對實際參數進行求值。所以,下列表達式:
print read http://en.wikipedia.org/wiki/Rebol
首先讀取維基百科的Rebol頁面,接着把結果傳遞給print
函數。圓括號可以用來改變求值的次序。使用前綴表示法,可以避免使用圓括號[4]。
這種簡單的優先級規則有如下優勢:
- 不需要在寫表示式的時候查看優先級表格,
- 不需要在定義新算符的時候重寫優先級表格,
- 表達式可以輕易的從中綴轉寫成前綴表示法或反之。
還有一個劣勢:
- 習慣了常規優先級規則的用戶容易出錯[7]。
parse
[編輯]parse
函數適合用於規定、驗證、變換和解釋方言。它通過在運行時間匹配「解析表達式」來完成工作[7]。
「解析表達式」是使用「解析方言」來書寫的,它類似於「執行方言」,是「數據交換方言」的面向表達式的子語言。不同於「執行方言」,「解析方言」使用關鍵字來代表算符和大多數重要的非終結符,中綴分析算符沒有前綴等價者並使用優先級規則(序列優先於選擇)[7]。
動作也可以被包含而在解析處理期間進行,並且parse
函數可以被用來處理塊或字符串。在「字符串解析」層級,parse
必須處理「低層」解析,需要考慮到字符和界定符。「塊解析」是更高層級,處理在Rebol值的級別上的掃描[7]。
解析方言屬於由自頂向下解析語言或解析表達文法(PEG)為代表的文法家族。主要的類似性是所有家族成員都有序列和選擇算符的出現。解析方言的語法和在解析方言和PEG之間的類似性可以用分析算術表達式的PEG示例的如下轉寫來展示:
Digit: charset [#"0" - #"9"]
Value: [some Digit | "(" Expr ")"]
Product: [Value any [["*"| "/"] Value]]
Sum: [Product any [["+"| "-"] Product]]
Expr: Sum
parse/all "12+13" Expr
引用
[編輯]- ^ REBOL Technologies. The REBOL/View and REBOL/Core 2.7.8 license (頁面存檔備份,存於網際網路檔案館)
- ^ R3 source at GitHub
- ^ Carl's REBOL Blog - Let's switch to .reb suffix. Rebol.com. August 18, 2013 [January 23, 2014]. (原始內容存檔於2020-09-24).
- ^ 4.0 4.1 4.2 4.3 4.4 4.5 4.6 Goldman, E., Blanton, J. (2000). REBOL: The Official Guide. McGraw-Hill Osborne Media. ISBN 0-07-212279-X.
- ^ 5.0 5.1 Crockford, Douglas. The JSON Saga (頁面存檔備份,存於網際網路檔案館), jsonsaga.ppt 網際網路檔案館的存檔,存檔日期October 4, 2012,.
- ^ Calling REBOL Rebol?. December 14, 2012 [December 2, 2013]. (原始內容存檔於December 3, 2013).
Sassenrath, Carl. Cross-compiling Rebol for your favorite embedded board. [16 September 2016]. (原始內容存檔於2020-12-02). - ^ 7.00 7.01 7.02 7.03 7.04 7.05 7.06 7.07 7.08 7.09 Roberts, Ralph (2000). REBOL for Dummies. Hungry Minds. ISBN 0-7645-0745-1.
- ^ 8.0 8.1 Auverlot, Olivier (2001). Rebol Programmation. Eyrolles. ISBN 2-212-11017-0.
- ^ Sassenrath, Carl. Inside the REBOL scripting language. Dr. Dobb's Journal. 2000-07-01 [2021-02-19]. (原始內容存檔於2009-04-27).
- ^ REBOL to become open source. Rebol.com. September 25, 2012 [January 23, 2014]. (原始內容存檔於2013-12-03).
- ^ Sassenrath, Carl. Comments on: R3 Source Code Released!. December 12, 2012 [August 14, 2014]. (原始內容存檔於2014-08-19).
You probably thought the source release would never happen? Am I right? Well, it's there now in github at github.com/rebol/rebol.
- ^ REBOL 3 Datatypes: Word!. [2022-02-10]. (原始內容存檔於2022-02-10).
延伸閱讀
[編輯]- 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 (頁面存檔備份,存於網際網路檔案館)