REBOL

REBOL（发音reb-ol ['reb-ol]，英文Relative Expression Based Object Language的缩写），自R3发行版改称为Rebol</ref>，是跨平台的数据交换语言和多范型的动态编程语言。由AmigaOS的系统架构师设计，用于网络通信和分布式计算。
简介.
REBOL介入了方言化的概念：用于代码和数据的小型的、的领域特定语言，据设计者所说这是这个语言最显著的性质：“尽管它可以用于编程、写函数和进行处理，它最大的长处是轻易的建立领域特定语言或方言的能力。”
知名于JavaScript开发上贡献的道格拉斯·克罗克福特，曾经描述Rebol为是对JSON有影响者之一：“更加现代的语言，但具有一些非常类似于Lisp的想法，它全部建造在数据表示之上，然后再被作为程序执行。”
最初，这个语言和它的官方实现，是REBOL技术公司开发的专有和封闭源代码的软件。经过跟的讨论，Rebol版本R3解释器于2012年12月12日在Apache 2.0许可证下发行。老版本能以二进制形式获得到，没有发行它们的源代码的规划。
Rebol已经被用于编程互联网应用（和二者）、数据库应用、实用工具和多媒体应用。
实例.
Rebol的设计原理之一就是“以简单方式做简单的事情”。使用下面的“可视界面方言”例子来描述一个具有图形用户界面的简单的Hello world程序：
<syntaxhighlight lang="smalltalk">view layout "Hello world!" button "Quit" </syntaxhighlight>
使用R3-GUI的类似的例子：
<syntaxhighlight lang="smalltalk">view "Hello world!" button "Quit" on-action </syntaxhighlight>
方言.
Rebol的领域特定语言叫做“方言”，是为特定用途优化的微型语言。方言可以用来定义业务规则、图形用户界面或在程序安装期间的屏幕序列。用户可以定义他们自己的方言，重用任何现存的Rebol单词并给予它在方言中的特殊含义。方言是有处理Robol块的函数以特殊方式解释的。
Rebol的方言能力的例子可以从单词codice_1看出来。在“数据交换方言”中codice_1就是个没有任何特殊含义的单词。在“执行方言”中, codice_1是个全局变量，指称传递回一个函数结果值的一个原生函数 。在“可视界面方言”（VID）中codice_1是一个关键字，导致布局引擎去模拟一个回车返回，移动“呈现笔”下至下一行的开始处。
具有图形能力的Rebol解释器必须理解和解释很多方言。下表按重要性依次列出最主要的方言。
语法.
Rebol的是自由形式的，不要求特殊定位。但是，通常使用缩进来更好将文本结构传达给人类读者。
不同方言的语法属性可以不同。对于所有Rebol方言的公共平台是“数据交换方言”；其他方言通常从它派生。除了是所有方言的公共平台之外，“数据交换方言”直接用来表示数据和元数据、迁移（populate）数据结构，在互联网上发送数据，并把它们保存在数据存储中。
对比于编程语言比如C，“数据交换方言”不构成自、语句、或关键字。有效的“数据交换方言”文本流是树数据结构，构成自块（根块是隐含的，子块由方括号），圆块（圆括号界定）、字符串（双引号或适用多行字符串的花括号来界定；脱字符表示法用于不可打印字符）、URL、e-mail地址、文件、路径或其他复合值。不同于ALGOL的块，Rebol的块是复合（composite）值，类似于Lisp中引用起来的表达式。代码以Rebol块的形式写成的事实，使语言具有同像性。
块还有圆块可以包含由空白分隔的其他复合值（一个块可以包含子块、圆块、字符串等等)或标量值比如：codice_5（单词）、codice_6（后缀着冒号的单词）、codice_7（前缀着冒号的单词）、codice_8（前缀着撇号的单词），数字、钱款、字符等。注意在单词中允许特殊字符，所以codice_9是一个单词，不同于codice_10，它是空格分隔的三个单词。
注释可以出现在分号之后直到行结束。多行注释或不被词法分析器忽略的注释，可以使用平常的数据类型比如多行字符串来书写。
语义.
块包含领域特定语言，它可以作为实际参数提交给特定的“求值器”函数。
do.
最常用的求值器是codice_11函数。它被缺省的用来解释给解释器控制台的文本输入。
由codice_11函数解释的“执行方言”，是一个的“数据交换方言”的子语言。语言的主要语义单元是。对比于派生自ALGOL的指令式编程语言，“执行方言”既没有关键字也没有语句。
单词被用作大小写不敏感变量。像在所有动态类型语言中那样，变量没有关联的类型，类型是关联于值的。在codice_11函数遇到一个单词的时候，返回对这个单词的求值结果。codice_6单词可以用于赋值。尽管没有语句，赋值和有副作用的函数在一起，可以用于指令式编程。
根块的子块自行用codice_11求值。块作为解释器实际参数这个性质被用来处理数据块，通过把块作为实际参数提交给控制函数如codice_16、codice_17、codice_18等用于结构化编程，在把块传递给特定解释器函数时用于方言。
值得注意的特殊问题是赋值给变量的复合值是不复制的。要制作一个复本，这个值必须传递给codice_19函数。
codice_11函数通常服从前缀表示法求值，这里函数处理跟随在其后的实际参数。但是，也存在使用中缀的中缀求值。中缀求职优先于前缀求值。例如：
返回codice_21，因为中缀加法优先于计算绝对值。在求值中缀表达式的时候，求值的次序是从左至右，没有算符优先于其他算符。例如
<syntaxhighlight lang="smalltalk">
2 + 3 * 4
</syntaxhighlight>
返回codice_22，对于乘法优先于加法的求值这将产生14。所有算法都有前缀版本。codice_23在将实际参数传递给函数之前通常对实际参数进行求值。所以，下列表达式：
<syntaxhighlight lang="text">
print read http://en.wikipedia.org/wiki/Rebol
</syntaxhighlight>
首先读取维基百科的Rebol页面，接着把结果传递给codice_24函数。圆括号可以用来改变求值的次序。使用前缀表示法，可以避免使用圆括号。
这种简单的优先级规则有如下优势：
还有一个劣势：
parse.
codice_25函数适合用于规定、验证、变换和解释方言。它通过在运行时间匹配“解析表达式”来完成工作。
“解析表达式”是使用“解析方言”来书写的，它类似于“执行方言”，是“数据交换方言”的面向表达式的子语言。不同于“执行方言”，“解析方言”使用关键字来代表算符和大多数重要的非终结符，中缀分析算符没有前缀等价者并使用优先级规则（序列优先于选择）。
动作也可以被包含而在解析处理期间进行，并且codice_25函数可以被用来处理块或字符串。在“字符串解析”层级，codice_25必须处理“低层”解析，需要考虑到字符和。“块解析”是更高层级，处理在Rebol值的级别上的扫描。
解析方言属于由或解析表达文法（PEG）为代表的文法家族。主要的类似性是所有家族成员都有序列和选择算符的出现。解析方言的语法和在解析方言和PEG之间的类似性可以用分析算术表达式的PEG示例的如下转写来展示：
<syntaxhighlight lang="smalltalk">
Digit: charset [#"0" - #"9"]
Value: Digit | "(" Expr ")"
Product: any "/" Value
Sum: any "-" Product
Expr: Sum
parse/all "12+13" Expr</syntaxhighlight>