[go: nahoru, domu]

跳至內容

「REBOL」:修訂間差異

維基百科,自由的百科全書
刪去的內容 新增的內容
第76行: 第76行:
| [[对象 (计算机科学)|对象]]定义/继承;[[基于原型编程]]
| [[对象 (计算机科学)|对象]]定义/继承;[[基于原型编程]]
|-
|-
| 可视界面方言<br />(VID)或RebGUI
| 可视界面方言<br />RebGUI
| <code>layout</code>函数<br/><code>display</code>函数
| <code>layout</code>函数<br/><code>display</code>函数
| 指定[[图形用户界面]]
| 指定[[图形用户界面]]
|-
|-

於 2021年2月19日 (五) 12:40 的修訂

Rebol
編程範型面向語言, 數據交換, 函數式, 基於原型, 指令式
設計者Carl Sassenrath英語Carl Sassenrath
實作者REBOL技術
面市時間1997年,​27年前​(1997
當前版本
  • 2.101.0 (2012年12月12日)
編輯維基數據鏈接
型態系統動態, 強類型
操作系統跨平台
許可證2.7.8是免費重新發行軟件英語Freely redistributable software[1] R3已經是Apache 2.0許可證[2]
文件擴展名.r, .reb[3]
網站www.rebol.com
啟發語言
Self, Forth, Lisp, Logo[4]
影響語言
JSON[5], Red英語Red (programming language)

REBOL(發音reb-ol ['reb-ol],英文Relative Expression Based Object Language的縮寫),是跨平台數據交換語言多范型動態編程語言。由AmigaOS的系統架構師Carl Sassenrath英語Carl Sassenrath設計,用於網絡通信和分布式計算

簡介

REBOL介入了方言化的概念:用於代碼和數據的小型的、優化英語Program optimization領域特定語言[6][7],據設計者Carl Sassenrath英語Carl Sassenrath所說這是這個語言最顯著的性質:

儘管它可以用於編程、寫函數和進行處理,它最大的長處是輕易的建立領域特定語言或方言的能力。

——Carl Sassenrath[8]

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

最初,這個語言和它的官方實現是REBOL技術公司開始的專有和封閉源代碼的軟件。經過跟Lawrence Rosen英語Lawrence Rosen (attorney)的討論[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]]

R3-GUI Hello world example

方言

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的語法英語syntax (programming languages)自由形式的,不要求特殊定位。但是,通常使用縮進來更好將文本結構傳達給人類讀者。

不同方言的語法屬性可以不同。對於所有Rebol方言的公共平台是「數據交換方言」;其他方言通常從它派生。除了是所有方言的公共平台之外,「數據交換方言」直接用來表示數據和元數據、遷移(populate)數據結構,在互聯網上發送數據,並把它們保存在數據存儲中。

對比於編程語言比如C,「數據交換方言」不構成自聲明英語declaration (computer science)語句表達式英語expression (programming)關鍵字。有效的「數據交換方言」文本流是樹數據結構,構成自塊(根塊是隱含的,子塊由方括號界定英語delimiter),圓塊(圓括號界定)、字符串雙引號或適用多行字符串的花括號來界定;脫字符表示法用於不可打印字符)、URL、e-mail地址、文件、路徑或其他複合值。不同於ALGOL,Rebol的塊是複合(composite)值,類似於Lisp中引用起來的表達式。代碼以Rebol塊的形式寫成的事實,使語言具有同像性[4]

塊還有圓塊可以包含其他複合值(一個塊可以包含子塊、圓塊、字符串等等)或標量值比如,單詞、set單詞(後綴着冒號的單詞)、get單詞(前綴着冒號的單詞)、lit單詞(前綴着撇號的單詞)、數字、錢款、字符等,由空白分隔。注意在單詞中允許特殊,所以a+b是一個單詞,不同於a + b,它是空格分隔的三個單詞。

注釋可以出現在分號之後直到行結束。多行注釋或不被詞法分析器忽略的注釋,可以使用平常的數據類型比如多行字符串來書寫[4]

語義

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

do

最常用的求值器是do函數。它被缺省的用來解釋給解釋器控制台的文本輸入。

do函數解釋的「do方言」,是一個面向表達式英語expression-oriented programming languages的「數據交換方言」的子語言。語言的主要語義單元是表達式英語expression (programming)。相對於派生自ALGOL的指令式編程語言,「do方言」既沒有關鍵字也沒有語句。

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

根塊的子塊自行求值。這個性質被用來處理數據塊,通過把塊作為實際參數提交給控制函數如ifeitherloop等用於結構化編程,在把塊傳遞給特定解釋器函數時用於方言[6]

值得注意的特殊問題是賦值給變量的複合值是不複製的。要製作一個複本,這個值必須傳遞給copy函數[4]

do函數通常服從前綴風格求值,這裡函數處理跟隨在其後的實際參數。但是,也存在使用中綴算符英語Operator (computer programming)中綴求值。中綴求職優先於前綴求值。例如:

abs -2 + 3

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

2 + 3 * 4

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

首先讀取維基百科的Rebol頁面,接着把結果傳遞給print函數。圓括號可以用來改變求值的次序。使用前綴表示法,可以避免使用圓括號[4]

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

  • 不需要在寫表示式的時候查看優先級表格,
  • 不需要在定義新算符的時候重寫優先級表格,
  • 表達式可以輕易的從中綴轉寫成前綴表示法或反之。

還有一個劣勢:

  • 習慣了常規優先級規則的用戶容易出錯[6]

parse

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

「解析表達式」是使用「解析方言」來書寫的,它類似於「do方言」,是「數據交換方言」的面向表達式的子語言。不同於「do方言」,「解析方言」使用關鍵字來代表算符和最重要的非終結符,中綴分析算符沒有前綴等價者並使用優先級規則(序列優先於選擇)[6]

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

解析方言屬於由自頂向下解析語言英語top-down parsing language解析表達文法(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

引用

  1. ^ REBOL Technologies. The REBOL/View and REBOL/Core 2.7.8 license
  2. ^ R3 source at GitHub
  3. ^ Carl's REBOL Blog - Let's switch to .reb suffix. Rebol.com. August 18, 2013 [January 23, 2014]. 
  4. ^ 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. ^ 5.0 5.1 Crockford, Douglas. The JSON Saga, jsonsaga.ppt 網際網路檔案館存檔,存檔日期October 4, 2012,.
  6. ^ 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. ^ 7.0 7.1 Auverlot, Olivier (2001). Rebol Programmation. Eyrolles. ISBN 2-212-11017-0.
  8. ^ Sassenrath, Carl. Inside the REBOL scripting language. Dr. Dobb's Journal. 2000-07-01. 
  9. ^ REBOL to become open source. Rebol.com. September 25, 2012 [January 23, 2014]. 
  10. ^ 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. 

延伸閱讀

外部連結