「REBOL」:修訂間差異
小 →方言 |
小 →方言 |
||
第76行: | 第76行: | ||
| [[对象 (计算机科学)|对象]]定义/继承;[[基于原型编程]] |
| [[对象 (计算机科学)|对象]]定义/继承;[[基于原型编程]] |
||
|- |
|- |
||
| 可视界面方言<br /> |
| 可视界面方言或<br />RebGUI |
||
| <code>layout</code>函数<br/> |
| <code>layout</code>函数或<br/><code>display</code>函数 |
||
| 指定[[图形用户界面]] |
| 指定[[图形用户界面]] |
||
|- |
|- |
於 2021年2月19日 (五) 12:40 的修訂
編程範型 | 面向語言, 數據交換, 函數式, 基於原型, 指令式 |
---|---|
設計者 | 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的縮寫),是跨平台的數據交換語言和多范型的動態編程語言。由AmigaOS的系統架構師Carl Sassenrath設計,用於網絡通信和分布式計算。
簡介
REBOL介入了方言化的概念:用於代碼和數據的小型的、優化的領域特定語言[6][7],據設計者Carl Sassenrath所說這是這個語言最顯著的性質:
儘管它可以用於編程、寫函數和進行處理,它最大的長處是輕易的建立領域特定語言或方言的能力。
——Carl Sassenrath[8]
知名於JavaScript開發上貢獻的道格拉斯·克羅克福特,曾經描述Rebol為「更加現代的語言,但具有一些非常類似於Lisp的想法,它全部建造在數據表示之上,然後再被作為程序執行」,是對JSON有影響者之一[5]。
最初,這個語言和它的官方實現是REBOL技術公司開始的專有和封閉源代碼的軟件。經過跟Lawrence Rosen的討論[9],Rebol版本3解釋器於2012年12月12日在Apache 2.0許可證下發行[10]。老版本能以二進制形式獲得到,沒有發行它們的源代碼的規劃。
Rebol已經被用於編程互聯網應用(客戶端和服務器端二者)、數據庫應用、實用工具和多媒體應用[6]。
實例
Rebol的設計原理之一就是「以簡單方式做簡單的事情」[6]。使用下面的「可視界面方言」例子來描述一個具有圖形用戶界面的簡單的Hello world程序:
view layout [text "Hello world!" button "Quit" [quit]]
使用R3-GUI的類似的例子:
view [text "Hello world!" button "Quit" on-action [quit]]
方言
Rebol的領域特定語言叫做「方言」,是為特定用途優化的微型語言。方言可以用來定義業務規則、圖形用戶界面或在程序安裝期間的屏幕序列。用戶可以定義他們自己的方言,重用任何現存的Rebol單詞並給予它在方言中的特殊含義[6]。方言是有處理Robol塊的函數以特殊方式解釋的。
Rebol的方言能力的例子可以從單詞return
看出來。在「數據交換方言」中return
就是個沒有任何特殊含義的單詞。在「do方言」中, return
是個全局變量,指稱傳遞迴一個函數結果值的一個原生函數[4] 。在「可以界面方言」(VID)中return
是一個關鍵字,導致布局引擎去模擬一個回車返回,移動「呈現筆」下至下一行的開始處[7]。
具有圖形能力的Rebol解釋器必須理解和解釋很多方言。下表按重要性依次列出最主要的方言。
方言名字 | 解釋於 | 用途 |
---|---|---|
數據交換方言 | load 函數
|
表示數據和元數據;Rebol方言的共用平台 |
Do方言 | do 函數
|
編程 |
解析方言 | parse 函數
|
模式匹配 |
函數規定方言 | make 函數
|
函數定義;函數式編程 |
對象規定方言 | make 函數
|
對象定義/繼承;基於原型編程 |
可視界面方言或 RebGUI |
layout 函數或display 函數
|
指定圖形用戶界面 |
繪圖方言 | view 函數
|
定義圖形元素(直線、多邊形等) |
腳本規定方言 | do 函數
|
腳本定義 |
安全政策方言 | secure 函數
|
指定安全政策 |
語法
Rebol的語法是自由形式的,不要求特殊定位。但是,通常使用縮進來更好將文本結構傳達給人類讀者。
不同方言的語法屬性可以不同。對於所有Rebol方言的公共平台是「數據交換方言」;其他方言通常從它派生。除了是所有方言的公共平台之外,「數據交換方言」直接用來表示數據和元數據、遷移(populate)數據結構,在互聯網上發送數據,並把它們保存在數據存儲中。
對比於編程語言比如C,「數據交換方言」不構成自聲明、語句、表達式或關鍵字。有效的「數據交換方言」文本流是樹數據結構,構成自塊(根塊是隱含的,子塊由方括號界定),圓塊(圓括號界定)、字符串(雙引號或適用多行字符串的花括號來界定;脫字符表示法用於不可打印字符)、URL、e-mail地址、文件、路徑或其他複合值。不同於ALGOL的塊,Rebol的塊是複合(composite)值,類似於Lisp中引用起來的表達式。代碼以Rebol塊的形式寫成的事實,使語言具有同像性[4]。
塊還有圓塊可以包含其他複合值(一個塊可以包含子塊、圓塊、字符串等等)或標量值比如,單詞、set單詞(後綴着冒號的單詞)、get單詞(前綴着冒號的單詞)、lit單詞(前綴着撇號的單詞)、數字、錢款、字符等,由空白分隔。注意在單詞中允許特殊,所以a+b
是一個單詞,不同於a + b
,它是空格分隔的三個單詞。
注釋可以出現在分號之後直到行結束。多行注釋或不被詞法分析器忽略的注釋,可以使用平常的數據類型比如多行字符串來書寫[4]。
語義
塊包含領域特定語言,它可以作為實際參數提交給特定的「求值器」函數[6]。
do
最常用的求值器是do
函數。它被缺省的用來解釋給解釋器控制台的文本輸入。
由do
函數解釋的「do方言」,是一個面向表達式的「數據交換方言」的子語言。語言的主要語義單元是表達式。相對於派生自ALGOL的指令式編程語言,「do方言」既沒有關鍵字也沒有語句。
單詞被用作大小寫不敏感變量。像在所有動態類型語言中那樣,變量沒有關聯的類型,類型是關聯於值的。在do
函數遇到一個單詞的時候,返回對這個單詞的求值結果。set單詞形式的單詞可以用於賦值。儘管沒有語句,賦值還有有副作用的函數可以用於指令式編程[4]。
根塊的子塊自行求值。這個性質被用來處理數據塊,通過把塊作為實際參數提交給控制函數如if
、either
、loop
等用於結構化編程,在把塊傳遞給特定解釋器函數時用於方言[6]。
值得注意的特殊問題是賦值給變量的複合值是不複製的。要製作一個複本,這個值必須傳遞給copy
函數[4]。
do
函數通常服從前綴風格求值,這裡函數處理跟隨在其後的實際參數。但是,也存在使用中綴算符的中綴求值。中綴求職優先於前綴求值。例如:
abs -2 + 3
返回1,因為中綴加法優先於計算絕對值。在求值中綴表達式的時候,求值的次序是從左至右,沒有算符優先於其他算符。例如
2 + 3 * 4
返回20,對於乘法優先於加法的求值這將產生14。所有算法都有前綴版本。Do
在將實際參數傳遞給函數之前通常對實際參數進行求值。所以,下列表達式:
print read http://en.wikipedia.org/wiki/Rebol
首先讀取維基百科的Rebol頁面,接着把結果傳遞給print
函數。圓括號可以用來改變求值的次序。使用前綴表示法,可以避免使用圓括號[4]。
這種簡單的優先級規則有如下優勢:
- 不需要在寫表示式的時候查看優先級表格,
- 不需要在定義新算符的時候重寫優先級表格,
- 表達式可以輕易的從中綴轉寫成前綴表示法或反之。
還有一個劣勢:
- 習慣了常規優先級規則的用戶容易出錯[6]。
parse
parse
函數適合用於規定、驗證、變換和解釋方言。它通過在運行時間匹配「解析表達式」來完成工作[6]。
「解析表達式」是使用「解析方言」來書寫的,它類似於「do方言」,是「數據交換方言」的面向表達式的子語言。不同於「do方言」,「解析方言」使用關鍵字來代表算符和最重要的非終結符,中綴分析算符沒有前綴等價者並使用優先級規則(序列優先於選擇)[6]。
動作也可以被包含而在解析處理期間進行,並且parse
函數可以被用來處理塊或字符串。在「字符串解析」層級,parse
必須處理「低層」解析,需要考慮到字符和界定符。「塊解析」是更高層級,處理在Rebol值的級別上的掃描[6]。
解析方言屬於由自頂向下解析語言或解析表達文法(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].
- ^ 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,.
- ^ 6.00 6.01 6.02 6.03 6.04 6.05 6.06 6.07 6.08 6.09 Roberts, Ralph (2000). REBOL for Dummies. Hungry Minds. ISBN 0-7645-0745-1.
- ^ 7.0 7.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.
- ^ REBOL to become open source. Rebol.com. September 25, 2012 [January 23, 2014].
- ^ Sassenrath, Carl. Comments on: R3 Source Code Released!. December 12, 2012 [August 14, 2014].
You probably thought the source release would never happen? Am I right? Well, it's there now in github at github.com/rebol/rebol.
延伸閱讀
- 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).
外部連結
|
|