[go: nahoru, domu]

跳至內容

「REBOL」:修訂間差異

維基百科,自由的百科全書
刪去的內容 新增的內容
Cewbot對話 | 貢獻
bot: 清理跨語言連結模式匹配成為內部連結:編輯摘要的red link經繁簡轉換後存在
Cewbot對話 | 貢獻
清理跨語言連結自由形式成為內部連結:編輯摘要的紅色內部連結乃正常現象,經繁簡轉換後存在,非bot錯誤編輯 (本次機械人作業已完成36.3%)
 
(未顯示由 5 位使用者於中間所作的 21 次修訂)
第3行: 第3行:
| name = Rebol
| name = Rebol
| logo = [[File:Rebol logo.png]]
| logo = [[File:Rebol logo.png]]
| paradigm = [[面向语言编程|面向语言]], [[数据交换]], [[函数式编程|函数式]], [[基于原型编程|基于原型]], [[指令式编程|指令式]] <!-- ordered by prominence-->
| paradigm = [[面向语言编程|面向语言]], [[数据交换]], [[同像性]], [[指令式编程|指令式]], [[函数式编程|函数式]], [[基于原型编程|基于原型]]
| year = {{Start date and age|1997}}
| year = {{Start date and age|1997}}
| designer = {{en-link|Carl Sassenrath|}}
| designer = {{en-link|Carl Sassenrath|}}
第12行: 第12行:
| latest_test_date = {{Start date and age|2012|12|12}}
| latest_test_date = {{Start date and age|2012|12|12}}
| typing = [[动态类型|动态]], [[强类型]]
| typing = [[动态类型|动态]], [[强类型]]
| license = 2.7.8为{{en-link|免费重新发布软件|Freely redistributable software}}<ref name="lic">REBOL Technologies. ''The REBOL/View and REBOL/Core 2.7.8 [http://www.rebol.com/license.html license]''</ref>,R3为[[Apache License|Apache 2.0许可证]]<ref name="r3src">[https://github.com/rebol/r3 R3 source] at [[GitHub]]</ref>
| license = 2.7.8为{{en-link|免费重新发布软件|Freely redistributable software}}<ref name="lic">REBOL Technologies. ''The REBOL/View and REBOL/Core 2.7.8 [http://www.rebol.com/license.html license] {{Wayback|url=http://www.rebol.com/license.html |date=20210506103107 }}''</ref>,<br />R3为[[Apache License|Apache 2.0许可证]]<ref name="r3src">[https://github.com/rebol/r3 R3 source] at [[GitHub]]</ref>
| file ext = .r, .reb<ref>{{cite web|url=http://www.rebol.com/article/0540.html |title=Carl's REBOL Blog - Let's switch to .reb suffix |publisher=Rebol.com |date=August 18, 2013 |access-date=January 23, 2014}}</ref>
| file ext = .r, .reb<ref>{{cite web |url=http://www.rebol.com/article/0540.html |title=Carl's REBOL Blog - Let's switch to .reb suffix |publisher=Rebol.com |date=August 18, 2013 |access-date=January 23, 2014 |archive-date=2020-09-24 |archive-url=https://web.archive.org/web/20200924202754/http://www.rebol.com/article/0540.html }}</ref>
| influenced_by = [[Self]], [[Forth]], [[Lisp]], [[Logo (程序语言)|Logo]]<ref name="OG">Goldman, E., Blanton, J. (2000). ''REBOL: The Official Guide.'' McGraw-Hill Osborne Media. {{ISBN|0-07-212279-X}}.</ref>
| influenced_by = [[Self]], [[Forth]], [[Lisp]], [[Logo (程序语言)|Logo]]<ref name="OG">Goldman, E., Blanton, J. (2000). ''REBOL: The Official Guide.'' McGraw-Hill Osborne Media. {{ISBN|0-07-212279-X}}.</ref>
| influenced = [[JSON]]<ref name="JSON">[[Douglas Crockford|Crockford, Douglas]]. ''[https://www.youtube.com/watch?v=-C-JoyNuQJs The JSON Saga]'', [http://crockford.com/codecamp/jsonsaga.ppt jsonsaga.ppt] {{Webarchive|url=https://web.archive.org/web/20121004043939/http://crockford.com/codecamp/jsonsaga.ppt# |date=October 4, 2012 }}</ref>, {{en-link|Red (编程语言)|Red (programming language)|Red}}
| influenced = [[JSON]]<ref name="JSON">[[Douglas Crockford|Crockford, Douglas]]. ''[https://www.youtube.com/watch?v=-C-JoyNuQJs The JSON Saga] {{Wayback|url=https://www.youtube.com/watch?v=-C-JoyNuQJs |date=20201103161004 }}'', [http://crockford.com/codecamp/jsonsaga.ppt jsonsaga.ppt] {{Webarchive|url=https://web.archive.org/web/20121004043939/http://crockford.com/codecamp/jsonsaga.ppt# |date=October 4, 2012 }}</ref>, {{en-link|Red (编程语言)|Red (programming language)|Red}}
| operating_system = [[跨平台]]
| operating_system = [[跨平台]]
| website = {{URL|www.rebol.com}}
| website = {{URL|www.rebol.com}}
第21行: 第21行:
}}
}}


'''REBOL'''(發音'''reb-ol''' ['reb-ol],英文'''R'''elative '''E'''xpression '''B'''ased '''O'''bject '''L'''anguage的缩写),自R3发行版改称为'''Rebol'''<ref>{{cite web |url=http://www.rebol.com/cgi-bin/blog.r?view=0525 |title=Calling REBOL Rebol? |date=December 14, 2012 <!--6:49 GMT--> |access-date=December 2, 2013 |archive-date=December 3, 2013 |archive-url=https://web.archive.org/web/20131203023615/http://www.rebol.com/cgi-bin/blog.r?view=0525 }}<br/>{{cite web|last1=Sassenrath|first1=Carl|title=Cross-compiling Rebol for your favorite embedded board|url=http://www.rebol.com/article/0526.html|access-date=16 September 2016}}</ref>,是[[跨平台]]的[[数据交换#數據交換語言|数据交换语言]]和[[编程范型|多范型]]的[[动态语言|动态]][[编程语言]]。由[[AmigaOS]]的系统架构师{{en-link|Carl Sassenrath|Carl Sassenrath}}设计,用于网络通信和[[分布式计算]]。
'''REBOL'''(發音'''reb-ol''' ['reb-ol],英文'''R'''elative '''E'''xpression '''B'''ased '''O'''bject '''L'''anguage的缩写),自R3发行版改称为'''Rebol'''<ref>{{cite web |url=http://www.rebol.com/cgi-bin/blog.r?view=0525 |title=Calling REBOL Rebol? |date=December 14, 2012 <!--6:49 GMT--> |access-date=December 2, 2013 |archive-date=December 3, 2013 |archive-url=https://web.archive.org/web/20131203023615/http://www.rebol.com/cgi-bin/blog.r?view=0525 }}<br/>{{cite web|last1=Sassenrath|first1=Carl|title=Cross-compiling Rebol for your favorite embedded board|url=http://www.rebol.com/article/0526.html|access-date=16 September 2016|archive-date=2020-12-02|archive-url=https://web.archive.org/web/20201202131330/http://www.rebol.com/article/0526.html}}</ref>,是[[跨平台]]的[[数据交换#數據交換語言|数据交换语言]]和[[编程范型|多范型]]的[[动态语言|动态]][[编程语言]]。由[[AmigaOS]]的系统架构师{{en-link|Carl Sassenrath|Carl Sassenrath}}设计,用于网络通信和[[分布式计算]]。


==简介==
==简介==
REBOL介入了方言化的概念:用于代码和数据的小型的、{{en-link|程序优化|Program optimization|优化}}的[[领域特定语言]]<ref name="RD">Roberts, Ralph (2000). ''REBOL for Dummies.'' Hungry Minds. {{ISBN|0-7645-0745-1}}.</ref><ref name="RP">Auverlot, Olivier (2001). ''Rebol Programmation.'' Eyrolles. {{ISBN|2-212-11017-0}}.</ref>,据设计者{{en-link|Carl Sassenrath|}}所说这是这个语言最显著的性质
REBOL介入了方言化的概念:用于代码和数据的小型的、{{en-link|程序优化|Program optimization|优化}}的[[领域特定语言]]<ref name="RD">Roberts, Ralph (2000). ''REBOL for Dummies.'' Hungry Minds. {{ISBN|0-7645-0745-1}}.</ref><ref name="RP">Auverlot, Olivier (2001). ''Rebol Programmation.'' Eyrolles. {{ISBN|2-212-11017-0}}.</ref>,据设计者{{en-link|Carl Sassenrath|}}所说这是这个语言最显著的性质:“尽管它可以用于编程、写函数和进行处理,它最大的长处是轻易的建立领域特定语言或方言的能力。<ref>{{cite web|last=Sassenrath|first=Carl|date=2000-07-01|url=http://www.ddj.com/184404172|title=Inside the REBOL scripting language|publisher=[[Dr. Dobb's Journal]]|access-date=2021-02-19|archive-date=2009-04-27|archive-url=https://web.archive.org/web/20090427025459/http://www.ddj.com/184404172}}</ref>”


知名于[[JavaScript]]开发上贡献的[[道格拉斯·克羅克福特]],曾经描述Rebol为是对[[JSON]]有影响者之一:“更加现代的语言,但具有一些非常类似于Lisp的想法,它全部建造在数据表示之上,然后再被作为程序执行<ref name="JSON" />
{{Quote|text=尽管它可以用于编程、写函数和进行处理,它最大的长处是轻易的建立领域特定语言或方言的能力。|author=Carl Sassenrath<ref name="DJ">{{cite web|last=Sassenrath|first=Carl|date=2000-07-01|url=http://www.ddj.com/184404172|title=Inside the REBOL scripting language|publisher=[[Dr. Dobb's Journal]]}}</ref>}}


最初,这个语言和它的官方实现是REBOL技术公司开发的[[专有软件|专有]]和封闭源代码的软件。经过跟{{en-link|Lawrence Rosen|Lawrence Rosen (attorney)|Lawrence Rosen}}的讨论<ref>{{cite web |url=http://www.rebol.com/article/0511.html |title=REBOL to become open source |publisher=Rebol.com |date=September 25, 2012 |access-date=January 23, 2014 |archive-date=2013-12-03 |archive-url=https://web.archive.org/web/20131203025424/http://www.rebol.com/article/0511.html }}</ref>,Rebol版本R3解释器于2012年12月12日在[[Apache许可证|Apache 2.0许可证]]下发行<ref>{{cite web|url=http://www.rebol.com/cgi-bin/blog.r?view=0519|title=Comments on: R3 Source Code Released!|first=Carl|last=Sassenrath|date=December 12, 2012|access-date=August 14, 2014|quote=''You probably thought the source release would never happen? Am I right? Well, it's there now in github at github.com/rebol/rebol.''|archive-date=2014-08-19|archive-url=https://web.archive.org/web/20140819084949/http://www.rebol.com/cgi-bin/blog.r?view=0519}}</ref>。老版本能以二进制形式获得到,没有发行它们的源代码的规划。
知名于[[JavaScript]]开发上贡献的[[道格拉斯·克羅克福特]],曾经描述Rebol为更加现代的语言,但具有一些非常类似于Lisp的想法,它全部建造在数据表示之上,然后再被作为程序执行”,是对[[JSON]]有影响者之一<ref name="JSON" />

最初,这个语言和它的官方实现是REBOL技术公司开发的[[专有软件|专有]]和封闭源代码的软件。经过跟{{en-link|Lawrence Rosen|Lawrence Rosen (attorney)|Lawrence Rosen}}的讨论<ref>{{cite web|url=http://www.rebol.com/article/0511.html |title=REBOL to become open source |publisher=Rebol.com |date=September 25, 2012 |access-date=January 23, 2014}}</ref>,Rebol版本R3解释器于2012年12月12日在[[Apache许可证|Apache 2.0许可证]]下发行<ref>{{cite web|url=http://www.rebol.com/cgi-bin/blog.r?view=0519 |title=Comments on: R3 Source Code Released!|first=Carl|last=Sassenrath|date=December 12, 2012|access-date=August 14, 2014 |quote=''You probably thought the source release would never happen? Am I right? Well, it's there now in github at github.com/rebol/rebol.''}}</ref>。老版本能以二进制形式获得到,没有发行它们的源代码的规划。


Rebol已经被用于编程[[互联网]][[应用软件|应用]]({{en-link|客户端|client-side}}和{{en-link|服务器端|server-side}}二者)、[[数据库]]应用、[[实用程序|实用工具]]和[[多媒体]]应用<ref name="RD" />。
Rebol已经被用于编程[[互联网]][[应用软件|应用]]({{en-link|客户端|client-side}}和{{en-link|服务器端|server-side}}二者)、[[数据库]]应用、[[实用程序|实用工具]]和[[多媒体]]应用<ref name="RD" />。
第95行: 第93行:


==语法==
==语法==
Rebol的{{en-link|语法 (编程语言)|syntax (programming languages)|语法}}是{{en-link|自由形式语言|free-form language|自由形式}}的,不要求特殊定位。但是,通常使用[[缩进风格|缩进]]来更好将文本结构传达给人类读者。
Rebol的{{en-link|语法 (编程语言)|syntax (programming languages)|语法}}是[[自由形式语言|自由形式]]的,不要求特殊定位。但是,通常使用[[缩进风格|缩进]]来更好将文本结构传达给人类读者。


不同方言的语法属性可以不同。对于所有Rebol方言的公共平台是“数据交换方言”;其他方言通常从它派生。除了是所有方言的公共平台之外,“数据交换方言”直接用来表示数据和元数据、迁移(populate)数据结构,在互联网上发送数据,并把它们保存在数据存储中。
不同方言的语法属性可以不同。对于所有Rebol方言的公共平台是“数据交换方言”;其他方言通常从它派生。除了是所有方言的公共平台之外,“数据交换方言”直接用来表示数据和元数据、迁移(populate)数据结构,在互联网上发送数据,并把它们保存在数据存储中。
第101行: 第99行:
对比于编程语言比如[[C语言|C]],“数据交换方言”不构成自{{en-link|声明 (计算机科学)|declaration (computer science)|声明}}、[[语句 (计算机科学)|语句]]、{{en-link|表达式 (计算机科学)|expression (programming)|表达式}}或[[保留字|关键字]]。有效的“数据交换方言”文本流是[[树 (数据结构)|树数据结构]],构成自块(根块是隐含的,子块由[[方括号]]{{en-link|界定符|delimiter|界定}}),圆块([[圆括号]]界定)、[[字符串]]([[双引号]]或适用多行字符串的[[花括号]]来界定;[[脱字符表示法]]用于不可打印字符)、[[统一资源定位符|URL]]、e-mail地址、文件、路径或其他[[变量 (计算机科学)|复合值]]。不同于[[ALGOL]]的[[块 (编程)|块]],Rebol的块是复合(composite)值,类似于[[Lisp]]中引用起来的[[表达式]]。代码以Rebol块的形式写成的事实,使语言具有[[同像性]]<ref name="OG" />。
对比于编程语言比如[[C语言|C]],“数据交换方言”不构成自{{en-link|声明 (计算机科学)|declaration (computer science)|声明}}、[[语句 (计算机科学)|语句]]、{{en-link|表达式 (计算机科学)|expression (programming)|表达式}}或[[保留字|关键字]]。有效的“数据交换方言”文本流是[[树 (数据结构)|树数据结构]],构成自块(根块是隐含的,子块由[[方括号]]{{en-link|界定符|delimiter|界定}}),圆块([[圆括号]]界定)、[[字符串]]([[双引号]]或适用多行字符串的[[花括号]]来界定;[[脱字符表示法]]用于不可打印字符)、[[统一资源定位符|URL]]、e-mail地址、文件、路径或其他[[变量 (计算机科学)|复合值]]。不同于[[ALGOL]]的[[块 (编程)|块]],Rebol的块是复合(composite)值,类似于[[Lisp]]中引用起来的[[表达式]]。代码以Rebol块的形式写成的事实,使语言具有[[同像性]]<ref name="OG" />。


块还有圆块可以包含由{{en-link|空白字符|Whitespace character|空白}}分隔的其他复合值(一个块可以包含子块、圆块、字符串等等)或[[变量 (计算机科学)|标量值]]比如:单词、set单词(后缀着[[冒号]]的单词)、get单词(前缀着冒号的单词)、lit单词(前缀着[[撇号]]的单词)数字、钱款、[[字符编码|字符]]等。注意在单词中允许特殊,所以<code>a+b</code>是一个单词,不同于<code>a + b</code>,它是空格分隔的三个单词。
块还有圆块可以包含由[[空白字符|空白]]分隔的其他复合值(一个块可以包含子块、圆块、字符串等等)或[[变量 (计算机科学)|标量值]]比如:<code>word</code>(单词<code>set-word</code>(后缀着[[冒号]]的单词)、<code>get-word</code>(前缀着冒号的单词)、<code>lit-word</code>(前缀着[[撇号]]的单词)<ref>{{cite web|url=http://www.rebol.com/r3/docs/datatypes/word.html|title=REBOL 3 Datatypes: Word!|access-date=2022-02-10|archive-date=2022-02-10|archive-url=https://web.archive.org/web/20220210215520/http://www.rebol.com/r3/docs/datatypes/word.html}}</ref>,数字、钱款、[[字符编码|字符]]等。注意在单词中允许特殊字符,所以<code>a+b</code>是一个单词,不同于<code>a + b</code>,它是空格分隔的三个单词。


[[注释 (计算机语言)|注释]]可以出现在[[分号]]之后直到行结束。多行注释或不被词法分析器忽略的注释,可以使用平常的数据类型比如多行字符串来书写<ref name="OG" />。
[[注释 (计算机语言)|注释]]可以出现在[[分号]]之后直到行结束。多行注释或不被词法分析器忽略的注释,可以使用平常的数据类型比如多行字符串来书写<ref name="OG" />。
第113行: 第111行:
由<code>do</code>函数解释的“执行方言”,是一个{{en-link|面向表达式编程语言|expression-oriented programming languages|面向表达式}}的“数据交换方言”的子语言。语言的主要语义单元是{{en-link|表达式 (计算机科学)|expression (programming)|表达式}}。对比于派生自[[ALGOL]]的指令式编程语言,“执行方言”既没有关键字也没有语句。
由<code>do</code>函数解释的“执行方言”,是一个{{en-link|面向表达式编程语言|expression-oriented programming languages|面向表达式}}的“数据交换方言”的子语言。语言的主要语义单元是{{en-link|表达式 (计算机科学)|expression (programming)|表达式}}。对比于派生自[[ALGOL]]的指令式编程语言,“执行方言”既没有关键字也没有语句。


单词被用作[[大小写敏感性|大小写不敏感]][[变量 (计算机科学)|变量]]。像在所有[[动态类型]]语言中那样,变量没有关联的类型,类型是关联于值的。在<code>do</code>函数遇到一个单词的时候,返回对这个单词的求值结果。set单词形式的单词可以用于[[赋值 (计算机科学)|赋值]]。尽管没有语句,赋值还有[[副作用 (计算机科学)|有副作用的函数]]可以用于[[指令式编程]]<ref name="OG" />。
单词被用作[[大小写敏感性|大小写不敏感]][[变量 (计算机科学)|变量]]。像在所有[[动态类型]]语言中那样,变量没有关联的类型,类型是关联于值的。在<code>do</code>函数遇到一个单词的时候,返回对这个单词的求值结果。<code>set-word</code>单词可以用于[[赋值 (计算机科学)|赋值]]。尽管没有语句,赋值[[副作用 (计算机科学)|有副作用的函数]]在一起,可以用于[[指令式编程]]<ref name="OG" />。


根块的子块自行用<code>do</code>求值。块作为解释器实际参数这个性质被用来处理数据块,通过把块作为实际参数提交给[[控制流程|控制]]函数如<code>if</code>、<code>either</code>、<code>loop</code>等用于[[结构化编程]],在把块传递给特定解释器函数时用于方言<ref name="RD" />。
根块的子块自行用<code>do</code>求值。块作为解释器实际参数这个性质被用来处理数据块,通过把块作为实际参数提交给[[控制流程|控制]]函数如<code>if</code>、<code>either</code>、<code>loop</code>等用于[[结构化编程]],在把块传递给特定解释器函数时用于方言<ref name="RD" />。
第119行: 第117行:
值得注意的特殊问题是赋值给变量的复合值是不复制的。要制作一个复本,这个值必须传递给<code>copy</code>函数<ref name="OG" />。
值得注意的特殊问题是赋值给变量的复合值是不复制的。要制作一个复本,这个值必须传递给<code>copy</code>函数<ref name="OG" />。


<code>do</code>函数通常服从[[波兰表示法|前缀风格求值]],这里函数处理跟随在其后的实际参数。但是,也存在使用中缀{{en-link|算符 (计算机编程)|Operator (computer programming)|算符}}的[[中缀表示法|中缀求值]]。中缀求职优先于前缀求值。例如:
<code>do</code>函数通常服从[[波兰表示法|前缀表示法]]求值,这里函数处理跟随在其后的实际参数。但是,也存在使用中缀{{en-link|算符 (计算机编程)|Operator (computer programming)|算符}}的[[中缀表示法|中缀求值]]。中缀求职优先于前缀求值。例如:
[[绝对值|abs]] -2 + 3
[[绝对值|abs]] -2 + 3
返回<code>1</code>,因为中缀加法优先于计算绝对值。在求值中缀表达式的时候,求值的次序是从左至右,没有算符[[运算次序|优先]]于其他算符。例如
返回<code>1</code>,因为中缀加法优先于计算绝对值。在求值中缀表达式的时候,求值的次序是从左至右,没有算符[[运算次序|优先]]于其他算符。例如
第126行: 第124行:
</syntaxhighlight>
</syntaxhighlight>
返回<code>20</code>,对于乘法优先于加法的求值这将产生14。所有算法都有前缀版本。<code>Do</code>在将实际参数传递给函数之前通常对实际参数进行求值。所以,下列表达式:
返回<code>20</code>,对于乘法优先于加法的求值这将产生14。所有算法都有前缀版本。<code>Do</code>在将实际参数传递给函数之前通常对实际参数进行求值。所以,下列表达式:
<syntaxhighlight lang="text">
<div class="plainlinks">
print read http://en.wikipedia.org/wiki/Rebol
print read http://en.wikipedia.org/wiki/Rebol
</syntaxhighlight>
</div>
首先读取维基百科的Rebol页面,接着把结果传递给<code>print</code>函数。圆括号可以用来改变求值的次序。使用[[波兰表示法|前缀表示法]],可以避免使用圆括号<ref name="OG" />。
首先读取维基百科的Rebol页面,接着把结果传递给<code>print</code>函数。圆括号可以用来改变求值的次序。使用[[波兰表示法|前缀表示法]],可以避免使用圆括号<ref name="OG" />。


第163行: 第161行:
== 外部链接 ==
== 外部链接 ==
* {{curlie|Computers/Programming/Languages/REBOL|REBOL}}
* {{curlie|Computers/Programming/Languages/REBOL|REBOL}}
* [http://re-bol.com/rebol.html A REBOL tutorial]
* [http://re-bol.com/rebol.html A REBOL tutorial] {{Wayback|url=http://re-bol.com/rebol.html |date=20210301001217 }}
* [http://learnrebol.com/rebol3_book.html Rebol 3 Tutorial]
* [http://learnrebol.com/rebol3_book.html Rebol 3 Tutorial] {{Wayback|url=http://learnrebol.com/rebol3_book.html |date=20210130011136 }}


{{程序设计语言}}
{{程序设计语言}}

於 2023年7月15日 (六) 09:12 的最新修訂

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的縮寫),自R3發行版改稱為Rebol[6],是跨平台數據交換語言多範式動態程式語言。由AmigaOS的系統架構師Carl Sassenrath英語Carl Sassenrath設計,用於網絡通訊和分散式計算

簡介[編輯]

REBOL介入了方言化的概念:用於代碼和數據的小型的、最佳化英語Program optimization領域特定語言[7][8],據設計者Carl Sassenrath英語Carl Sassenrath所說這是這個語言最顯著的性質:「儘管它可以用於編程、寫函數和進行處理,它最大的長處是輕易的建立領域特定語言或方言的能力。[9]

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

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

R3-GUI Hello world example

方言[編輯]

Rebol的領域特定語言叫做「方言」,是為特定用途最佳化的微型語言。方言可以用來定義業務規則、圖形化使用者介面或在程式安裝期間的螢幕序列。用戶可以定義他們自己的方言,重用任何現存的Rebol單詞並給予它在方言中的特殊含義[7]。方言是有處理Robol塊的函數以特殊方式解釋的。

Rebol的方言能力的例子可以從單詞return看出來。在「數據交換方言」中return就是個沒有任何特殊含義的單詞。在「執行方言」中, return是個全域變數,指稱傳遞迴一個函數結果值的一個原生函數[4] 。在「可視介面方言」(VID)中return是一個關鍵字,導致佈局引擎去模擬一個Enter返回,移動「呈現筆」下至下一行的開始處[8]

具有圖形能力的Rebol直譯器必須理解和解釋很多方言。下表按重要性依次列出最主要的方言。

方言名字 解釋於 用途
數據交換方言 load函數 表示數據和元數據;Rebol方言的共用平台
執行方言 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]

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

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

語意[編輯]

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

do[編輯]

最常用的求值器是do函數。它被預設的用來解釋給直譯器控制台的文字輸入。

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

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

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

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

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

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必須處理「低層」解析,需要考慮到字元界定符英語delimiter。「塊解析」是更高層級,處理在Rebol值的級別上的掃描[7]

解析方言屬於由自頂向下解析語言英語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]. (原始內容存檔於2020-09-24). 
  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. ^ 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. ^ 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. ^ 8.0 8.1 Auverlot, Olivier (2001). Rebol Programmation. Eyrolles. ISBN 2-212-11017-0.
  9. ^ Sassenrath, Carl. Inside the REBOL scripting language. Dr. Dobb's Journal. 2000-07-01 [2021-02-19]. (原始內容存檔於2009-04-27). 
  10. ^ REBOL to become open source. Rebol.com. September 25, 2012 [January 23, 2014]. (原始內容存檔於2013-12-03). 
  11. ^ 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. 
  12. ^ REBOL 3 Datatypes: Word!. [2022-02-10]. (原始內容存檔於2022-02-10). 

延伸閱讀[編輯]

外部連結[編輯]