**REBOL**（發音**reb-ol** ['reb-ol]，英文**R**elative **E**xpression **B**ased **O**bject **L**anguage的缩写），自R3发行版改称为**Rebol**，是跨平台的数据交换语言和多范型的动态编程语言。由AmigaOS的系统架构师Carl Sassenrath（英语：）设计，用于网络通信和分布式计算。

简介
--

REBOL介入了方言化的概念：用于代码和数据的小型的、优化（英语：）的领域特定语言，据设计者Carl Sassenrath（英语：）所说这是这个语言最显著的性质："尽管它可以用于编程、写函数和进行处理，它最大的长处是轻易的建立领域特定语言或方言的能力。"

知名于JavaScript开发上贡献的道格拉斯·克羅克福特，曾经描述Rebol为是对JSON有影响者之一："更加现代的语言，但具有一些非常类似于Lisp的想法，它全部建造在数据表示之上，然后再被作为程序执行。"

最初，这个语言和它的官方实现，是REBOL技术公司开发的专有和封闭源代码的软件。经过跟Lawrence Rosen（英语：）的讨论，Rebol版本R3解释器于2012年12月12日在Apache 2.0许可证下发行。老版本能以二进制形式获得到，没有发行它们的源代码的规划。

Rebol已经被用于编程互联网应用（客户端和服务器端二者）、数据库应用、实用工具和多媒体应用。

实例
--

Rebol的设计原理之一就是"以简单方式做简单的事情"。使用下面的"可视界面方言"例子来描述一个具有图形用户界面的简单的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单词并给予它在方言中的特殊含义。方言是有处理Robol块的函数以特殊方式解释的。

Rebol的方言能力的例子可以从单词`return`看出来。在"数据交换方言"中`return`就是个没有任何特殊含义的单词。在"执行方言"中, `return`是个全局变量，指称传递回一个函数结果值的一个原生函数 。在"可视界面方言"（VID）中`return`是一个关键字，导致布局引擎去模拟一个回车返回，移动"呈现笔"下至下一行的开始处。

具有图形能力的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块的形式写成的事实，使语言具有同像性。

块还有圆块可以包含由空白分隔的其他复合值（一个块可以包含子块、圆块、字符串等等)或标量值比如：`word`（单词）、`set-word`（后缀着冒号的单词）、`get-word`（前缀着冒号的单词）、`lit-word`（前缀着撇号的单词），数字、钱款、字符等。注意在单词中允许特殊字符，所以`a+b`是一个单词，不同于`a + b`，它是空格分隔的三个单词。

注释可以出现在分号之后直到行结束。多行注释或不被词法分析器忽略的注释，可以使用平常的数据类型比如多行字符串来书写。

语义
--

块包含领域特定语言，它可以作为实际参数提交给特定的"求值器"函数。

### do

最常用的求值器是`do`函数。它被缺省的用来解释给解释器控制台的文本输入。

由`do`函数解释的"执行方言"，是一个面向表达式（英语：）的"数据交换方言"的子语言。语言的主要语义单元是表达式（英语：）。对比于派生自ALGOL的指令式编程语言，"执行方言"既没有关键字也没有语句。

单词被用作大小写不敏感变量。像在所有动态类型语言中那样，变量没有关联的类型，类型是关联于值的。在`do`函数遇到一个单词的时候，返回对这个单词的求值结果。`set-word`单词可以用于赋值。尽管没有语句，赋值和有副作用的函数在一起，可以用于指令式编程。

根块的子块自行用`do`求值。块作为解释器实际参数这个性质被用来处理数据块，通过把块作为实际参数提交给控制函数如`if`、`either`、`loop`等用于结构化编程，在把块传递给特定解释器函数时用于方言。

值得注意的特殊问题是赋值给变量的复合值是不复制的。要制作一个复本，这个值必须传递给`copy`函数。

`do`函数通常服从前缀表示法求值，这里函数处理跟随在其后的实际参数。但是，也存在使用中缀算符（英语：）的中缀求值。中缀求职优先于前缀求值。例如：

```
abs -2 + 3
```

返回`1`，因为中缀加法优先于计算绝对值。在求值中缀表达式的时候，求值的次序是从左至右，没有算符优先于其他算符。例如

```
2 + 3 \* 4

```

返回`20`，对于乘法优先于加法的求值这将产生14。所有算法都有前缀版本。`Do`在将实际参数传递给函数之前通常对实际参数进行求值。所以，下列表达式：

```
print read http://en.wikipedia.org/wiki/Rebol

```

首先读取维基百科的Rebol页面，接着把结果传递给`print`函数。圆括号可以用来改变求值的次序。使用前缀表示法，可以避免使用圆括号。

这种简单的优先级规则有如下优势：

* 不需要在写表示式的时候查看优先级表格，
* 不需要在定义新算符的时候重写优先级表格，
* 表达式可以轻易的从中缀转写成前缀表示法或反之。

还有一个劣势：

* 习惯了常规优先级规则的用户容易出错。

### parse

`parse`函数适合用于规定、验证、变换和解释方言。它通过在运行时间匹配"解析表达式"来完成工作。

"解析表达式"是使用"解析方言"来书写的，它类似于"执行方言"，是"数据交换方言"的面向表达式的子语言。不同于"执行方言"，"解析方言"使用关键字来代表算符和大多数重要的非终结符，中缀分析算符没有前缀等价者并使用优先级规则（序列优先于选择）。

动作也可以被包含而在解析处理期间进行，并且`parse`函数可以被用来处理块或字符串。在"字符串解析"层级，`parse`必须处理"低层"解析，需要考虑到字符和界定符（英语：）。"块解析"是更高层级，处理在Rebol值的级别上的扫描。

解析方言属于由自顶向下解析语言（英语：）或解析表达文法（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. ↑ . Rebol.com. August 18, 2013  [January 23, 2014]. （原始内容存档于2020-09-24）.
4. 1 2 3 4 5 6 7  Goldman, E. Blanton, J. (2000). *REBOL: The Official Guide.* McGraw-Hill Osborne Media. ISBN 0-07-212279-X.
5. 1 2  Crockford, Douglas. *The JSON Saga （页面存档备份，存于）*, jsonsaga.ppt 的存檔，存档日期October 4, 2012，.
6. ↑ . December 14, 2012  [December 2, 2013]. （原始内容存档于December 3, 2013）.   
Sassenrath, Carl..  [16 September 2016]. （原始内容存档于2020-12-02）.
7. 1 2 3 4 5 6 7 8 9 10  Roberts, Ralph (2000). *REBOL for Dummies.* Hungry Minds. ISBN 0-7645-0745-1.
8. 1 2  Auverlot, Olivier (2001). *Rebol Programmation.* Eyrolles. ISBN 2-212-11017-0.
9. ↑  Sassenrath, Carl.. Dr. Dobb's Journal. 2000-07-01  [2021-02-19]. （原始内容存档于2009-04-27）.
10. ↑ . Rebol.com. September 25, 2012  [January 23, 2014]. （原始内容存档于2013-12-03）.
11. ↑  Sassenrath, Carl.. 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.*
12. ↑ .  [2022-02-10]. （原始内容存档于2022-02-10）.

延伸阅读
----

* Mikes, Nora.. LinuxWorld. November 20, 1999. （原始内容存档于March 24, 2005）.
* Story, Derrick.. Web Review. Aug 27, 1999. （原始内容存档于October 12, 1999）.

外部链接
----

* 中的"REBOL"
* A REBOL tutorial （页面存档备份，存于）
* Rebol 3 Tutorial （页面存档备份，存于）



|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
程序设计语言 |
| --- |
|  |
| 按范型 | 

|  |  |
| --- | --- |
| 过程式 | 
* FORTRAN
* COBOL
* ALGOL 60
* BASIC
	+ QB64（英语：）
* PL/I
* MUMPS（英语：）
* ALGOL 68
* Forth
* Pascal
	+ Turbo Pascal
* C
* Modula-2
* Ada 83
* occam
* Oberon
* Go
* Zig
* Carbon

 |
|  |
| 面向对象 | 
* Simula 67
* Smalltalk
* C++
* Objective-C
* Eiffel
* Object Pascal
	+ Delphi
* Self
* Visual Basic
	+ Gambas
* Ada 95
* Java
* C#
	+ Vala
* Fantom（英语：）
* Crystal（英语：）

 |
|  |
| 多范型 | 
* Modula-3
* Dylan
* Python
* Lua
* JavaScript
* Ruby
* D
* Factor
* Scala
* F#
	+ F\*
* Haxe
* Dafny（英语：）
* Nim
* Rust
* Dart
* Julia
* Swift
* Bosque（英语：）

 |
|  |
| 函数式 | 

|  |
| --- |
| 
* LISP
	+ Scheme
	+ Common Lisp
	+ Clojure
* Logo
* APL/J
* ML
	+ Standard ML
	+ OCaml
* Erlang
	+ Elixir
* Haskell
	+ Curry
* SAC
* Agda
* Idris
* Pure（英语：）
* jq（英语：）
* Cuneiform

 |

 |
|  |
| 逻辑式 | 
* Prolog
* Datalog
* Mercury
* AnsProlog

 |

 |
|  |
| 脚本语言 | 

|  |  |
| --- | --- |
| 动态语言 | 
* SNOBOL
* Icon
* REXX
* Perl
	+ Raku
* Tcl/Tk
* CLOS
* newLISP
* Python
* Lua
* Ruby
* PHP
	+ Hack
* REBOL
	+ Red（英语：）
* Julia

 |
|  |
| Shell语言 | 
* Unix shell
	+ sh
	+ csh/tcsh
	+ ksh
	+ bash
	+ ash
	+ zsh
	+ rc（英语：）
	+ fish
* sed
* AWK
* PowerShell

 |
|  |
| ECMA-262 | 
* ECMAScript
	+ JavaScript
* TypeScript
* Node.js/Deno
* CoffeeScript/LiveScript（英语：）
* Elm
* PureScript
* Reason

 |

 |
|  |
| 特定平台 | 

|  |  |
| --- | --- |
| .NET | 
* C#
* C++/CLI
* F#
* PowerShell
* VB.NET
* Small Basic

 |
|  |
| JVM | 
* Java
	+ AspectJ（英语：）
* Scala
* Clojure
* Groovy
* Kotlin

 |

 |
|  |
| 特定领域 | 

|  |  |
| --- | --- |
| 科学计算 | 
* Speakeasy（英语：）
* IDL
	+ GDL
* Maxima
* Maple
* MATLAB
	+ Octave
	+ Scilab
* Wolfram
* R
* Yorick（英语：）
* SageMath
* Julia

 |
|  |
| GPU计算 | 
* GLSL
* HLSL
* OpenCL
* CUDA
* Futhark

 |
|  |
| 数据查询 | 
* SQL
	+ PL/SQL
	+ T-SQL
	+ SQL/PSM（英语：）
* xBase（英语：）
* XPath
* XQuery（英语：）
* GraphQL

 |
|  |
| 可视化 | 
* Simulink
* LabVIEW
* Orange（英语：）
* KNIME（英语：）
* Scratch
	+ Snap!
* Power Fx

 |
|  |
| 传媒设计 | 
* SuperCollider
* Pure Data
* Processing
* ChucK

 |

 |
|  |
| 其它 | 
* 汇编语言
* make
* PostScript
* XSLT
* WebAssembly

 |
|  |
| 
* 分类 目录
* 列表级条目 列表
* 历史
* 比较（英语：）
* 时间线（英语：）

 |

 |

|  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
数据交换格式 |
| --- |
|  |
| 人类可读的格式 | 
* Atom
* XML
* YAML
* JSON
* 資源描述框架（RDF）
* REBOL
* RSS
* 网络本体语言（OWL）
* 属性列表 (Property List)
* TOML

 |
|  |
| 二进制格式 | 
* AMF（英语：）
* ASN.1
* Avro
* Base64
* BSON
* CBOR（英语：）
* FlatBuffers（英语：）
* MessagePack
* Protocol Buffers
* Thrift
* Smile（英语：）
* XDR

 |

 |