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 (页面存档备份,存于互联网档案馆)