By Carl Sassenrath REBOL Technologies
翻译:ShiningRay @ NirvanaStudio
目录
1. 介绍
REBOL是针对互联网通讯设计的。REBOL是一种高级解释语言允许你访问和控制互联网的资源,而且他的便捷让你可以开始考虑把互联网当成你的个人操作系统。你已经熟悉了如何使用浏览器在网上冲浪。有了REBOL,你可以编写互联网。
在REBOL总部我们用REBOL建立手册和文档(比如当前这个),生成全部我们的网站、自动上传页面和图像到网络上、发送邮件通知、处理信用卡、远程共享文件、跟踪客户订单、进行即使通讯、主持电子会议、自动更新软件、运行技术支持、管理我们的错误数据库、删除垃圾邮件、备份服务器、遍历网络、过滤网页广告、还有——最重要的——在42种不同的系统上构建REBOL。
每天我们在几十台机器上用数百个REBOL脚本给我们带来了极大的便利。我们只要一种语言就能完成所有的事情。就像一个神奇的魔术师,REBOL使我们这个小小的小组事倍功半。
这篇指南提供了使用REBOL的简要的介绍。如果你正在慢慢得阅读那份720页的REBOL手册,我们也很理解,谁会有时间把它全部看下来呢?抱着这种想法,这篇文档的目标是在20分钟之内给你一个REBOL的大体概念并且给出一些可以找到更多资料的链接。
2. 数据类型的世界
语言是建立在一系列基本的数据类型的基础上的,他们被用来构建一切的其他东西。整数和字符串都是数据类型的例子。大多数语言有大约5种或者6种数据类型。相反,REBOL有45种数据类型。这种结果是很多任务下你可以关注于你的程序要做什么,而不是如何去做。
例如,所有的语言都可以让你对数字相加:
1 |
<strong>101 + 10</strong> |
然而,在REBOL中,你可以一样很容易的加减时间、日期、货币、元组和坐标。这里有一些例子,还有他们的结果:
1 2 3 4 5 6 7 8 9 10 |
<strong>10:55 + 0:10</strong> 11:05 <strong>1-Jan-2001 + 100</strong> 11-Apr-2001 <strong>.55 + 0</strong> 0.55 <strong>100.30.5 + 100.5.5</strong> 200.35.10 <strong>100x200 + 100x40</strong> 200x240 |
注意你不需要包含(include)任何文件,使用引入(import)语句,或者进行函数声明。他们是语言中的基础部分。
同时注意你使用同一种记号来相加各种类型。大多数函数都可工作于多种数据类型上。他们是多态的;他们可以和多种数据类型一起工作。结果是什么?你将变得更高效,却无需让你的程序变得更复杂。简单的东西就应该让他简单。
这里是另一个例子,它搜索第一个字符串中出现的第二个字符串:
1 |
<strong>find "World Wide Reb" "wide"</strong> |
同样的搜索操作也可以操作其他数据类型,比如电子邮件地址,URL,文件,标签,序列号,二进制和块:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<strong>find user@widetire.dom "wide"</strong> widetire.dom <strong>find http://www.rebol.com/wide/range.html "wide"</strong> wide/range.html <strong>find %/c/files/wide.txt "wide"</strong> %wide.txt <strong>find #ABC-WIDE-02120 "wide"</strong> #WIDE-02120 <strong>find #{746865207769646520776F726C64} "wide"</strong> #{7769646520776F726C64} <strong>find [123 10:30 "wide" 1-Jan-2001] "wide"</strong> ["wide" 1-Jan-2001] |
对REBOL的其他35种数据类型感到好奇了?在控制台下面输入这一行来把他们都列出来:
1 |
<strong>help datatype!</strong> |
过着看一下REBOL指南的值附录。
3. 集成网络操作
作为“互联网操作系统”的脚本语言,你需要能访问互联网的协议就像操作文件一样简单。REBOL已经内置了14种标准协议,也不需要包含文件或者函数声明。你只要使用他们。
例如,要从你的硬盘上读取并显示一个文本文件,你可以写:(注意百分号在REBOL中表示他是一个文件名。这必须出现来防止REBOL把他认作是一个REBOL单词。)
1 |
<strong>print read %datafile.txt</strong> |
你可以一样简单的使用各种不同的协议从网路上读取文本。下面几行例子展示了他做了什么:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<strong>read http://www.rebol.com/index.html</strong> (从网上读取一个HTML页面) <strong>read ftp://ftp.rebol.com/test.txt</strong> (使用FTP下载文件) <strong>read pop://fred:pass@example.com</strong> (读取所有的邮件消息,但不删除它们) <strong>read nntp://news.example.com/alt.test</strong> (从一个新闻组读取所有的发帖) <strong>read whois://example.com@rs.internic.net</strong> (读取一个互联网域的信息) <strong>read finger://username@example.com</strong> (返回关于一个用户帐户的信息) <strong>read daytime://everest.cclabs.missouri.edu</strong> (从一个服务器上读取时间) <strong>read dns://</strong> (返回你本地机器的地址) |
如果你自己要实验这些代码,只要在这些read的前面加上一个print并且给出一个有效的URL信息。注意如果你使用了一个防火墙,你需要设置你的REBOL代理设置来看到结果。当然,这些例子仅仅是一个开始。还有很多其他特性可以使用。例如,要从一个网站读取一个图像并且把他存到磁盘上的一个文件中:
1 2 |
<strong>write/binary %link.jpg read/binary</strong> <strong>http://www.rebol.com/graphics/link.jpg</strong> |
write函数使用了一个/binary精化来指明这是一个二进制文件,不是一个文本文件。
什么是“精化”(Refinement)? | ||
一个“精化”(refinement)指定了一个函数的变体。精化以一个斜杠(/)开始同时一个函数可以包含多个精化。要了解一个函数有哪些可用的精化,在命令行下输入help并在后面加上函数名称。例如:
将会给出write函数的描述和他的参数以及精化。 |
1 |
<strong>send fred@example.com read %message.txt</strong> |
而且甚至,你可以一样简单的发送一个网页:
1 |
<strong>send fred@example.com read http://www.rebol.com</strong> |
当然,如果你要做的只是发送一个文本消息,你可以写:
1 |
<strong>send fred@example.com "Hello Fred!"</strong> |
要写一行可以读取一个图像文件并且上传到一个Internet服务器的代码,你可以这样写:
1 2 |
<strong>write/binary ftp://user:pass@example.com/pub/link.jpg</strong> <strong>read/binary %link.jpg</strong> |
注意你必须给出用户名和密码作为URL的一部分。
你是不是想上传一整个目录的文件?这个脚本可以完成这个工作:
1 2 3 4 5 |
<strong>site: ftp://user:pass@example.com/pub/</strong> <strong>foreach file read %thefiles/ [</strong> <strong>write/binary site/:file read/binary file</strong> <strong>]</strong> |
注意这里用到了site单词的另一个精化。当一个精化是用在URL上的,他会把这个URL和他提供的文件名组合在一起。file前面的冒号是在说“获取文件名”。添加一个print到循环中来看看结果:
1 |
<strong>print site/:file</strong> |
也许你只想要上传目录中的JPEG文件。用find检查文件名就像前面一节演示的那样:
1 2 3 4 5 |
<strong>foreach file read %thefiles/ [</strong> <strong>if find file ".jpg" [</strong> <strong>write/binary site/:file read/binary file</strong> <strong>]</strong> <strong>]</strong> |
如果要上传所有的GIF和JPEG文件,你可以写成:
1 2 3 4 5 6 7 8 |
<strong>foreach file read %thefiles/ [</strong> <strong>if any [</strong> <strong>find file ".jpg" </strong> <strong>find file ".gif"</strong> <strong>] [</strong> <strong>write/binary site/:file read/binary file</strong> <strong>]</strong> <strong>]</strong> |
现在,让我们设想你只想上传那些在两天内修改过的文件:
1 2 3 4 5 6 7 |
<strong>date: now - 2</strong> <strong>foreach file read %thefiles/ [</strong> <strong>if (modified? file) > date [</strong> <strong>write/binary site/:file read/binary file</strong> <strong>]</strong> <strong>]</strong> |
变量date被设置为当前的日期和时间减去两天。再用他和文件和文件的日期——通过modified?函数来获取——相比较。
你可以很简单地写出只传输小于一定大小的文件将比较的一行代码换成:
1 |
<strong>if (size? file) < 100000 [</strong> |
或者,你可以避开子目录:
1 |
<strong>if not dir? file [</strong> |
这些函数也可以和URL一起工作。你可以检查远程文件的大小:
1 |
<strong>print size? ftp://user:pass@example.com/pub/image.jpg</strong> |
你也可以检查文件的修改日期and you can check the file modification date with:
1 |
<strong>print modified? ftp://user:pass@example.com/pub/image.jpg</strong> |
这一层次上的互联网集成让你可以在你的程序中十分简单的操作网络资源。例如,在REBOL/View中如果你想建立一个窗口并使用一个来自互联网上的图像文件,你可以写成:
1 2 3 |
<strong>view layout [</strong> <strong>image http://www.rebol.com/graphics/link.jpg</strong> <strong>]</strong> |
这个的结果是产生了一个窗口显示图像像这样:
如果你想改变窗口的颜色并且把图像放到一个按钮中,点击之后浏览一个网站,这里是扩展的例子:
1 2 3 4 5 6 |
<strong>view layout [</strong> <strong>backcolor white</strong> <strong>image http://www.rebol.com/graphics/link.jpg [</strong> <strong>browse http://www.rebol.com</strong> <strong>]</strong> <strong>]</strong> |
他会看起来像:
类似的,你可以把前面的网络函数添加到这个脚本中。例如,这个按钮可以进行FTP上传或者下载、接收邮件、发送邮件,监测新闻组,获取一个用户的信息,和任何其他的事情。
最后,要展示REBOL和互联网的完整的集成,你可以直接从网络上运行其它的REBOL程序。他们可以从以上任何一种返回一个有效的脚本的协议中运行。例如,这里是一个他如何从一个网站上运行一个脚本:
1 |
<strong>do http://www.rebol.com/view/demos/gel.r</strong> |
do函数下载脚本并运行它。要从FTP运行它,你可以写成:
1 |
<strong>do ftp://www.rebol.com/pub/gel.r</strong> |
你现在可以对REBOL如何“编写互联网”有一个更好的概念。作为最后一个例子,我们结合了图像按钮和do例子:
1 2 3 4 5 6 |
<strong>view layout [</strong> <strong>backcolor white</strong> <strong>image http://www.rebol.com/graphics/link.jpg [</strong> <strong>do http://www.reboltech.com/library/scripts/rim.r</strong> <strong>]</strong> <strong>]</strong> |
当你点击图像的时候,他会启动RIM,REBOL即时通讯软件。你对RIM好奇吗?试试这个:
1 |
<strong>print size? http://www.rebol.com/view/demos/rim.r</strong> |
这个即时通讯软件怎么这么小呢?看看代码:
1 |
<strong>print read http://www.rebol.com/view/demos/rim.r</strong> |
你就知道了。
要了解网络编程的更多内容,请阅读REBOL指南的网络编程一章。
4. 创建脚本文件
REBOL文件可以用作代码、数据或者是两者的结合。这些文件可以用任何文本编辑器建立,或者他们可以作为其他程序的运行结果创建。例如,我们公司使用REBOL文件来储存很多我们每日使用的数据库。
每个REBOL文件以一个标识他的内容、作者、版本、历史和各种其他可选的字段的头部。这个信息十分有用,我们也鼓励你在你的每个脚本中给出他。他将帮助大家了解:
- 这个脚本做什么
- 谁写的
- 他现在什么版本
- 他最后什么时候修改的
- 谁拥有它
- 他应该使用什么文件名
这个脚本头总是用REBOL自身来描述。他们是REBOL可以读取的元数据。这允许基于REBOL的搜索引擎和存档服务更方便得建立有用的文件索引。另外,智能的文本编辑器和代码版本软件可以自动跟踪版本。
这里有一个最小化头的范例,你可以用于上面演示的任何脚本中:
1 2 3 4 5 6 |
<strong>REBOL [</strong> <strong>Title: "Short Title Here"</strong> <strong>Date: 10-July-2001</strong> <strong>Author: "Your Name"</strong> <strong>Version: 1.0.0</strong> <strong>]</strong> |
注意日期和版本并没有加引号。他们是按照REBOL的数据类型来写的。前者是date类型,后者是一个元组tuple(注意它必须要有三个部分)。
从前一节中拿出最后一个例子,这里是完整的例子脚本文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<strong>REBOL [</strong> <strong>Title: "RIM Button"</strong> <strong>Date: 10-July-2001</strong> <strong>Author: "Carl Sassenrath"</strong> <strong>Version: 1.0.0</strong> <strong>]</strong> <strong>view layout [</strong> <strong>backcolor white</strong> <strong>image http://www.rebol.com/graphics/link.jpg [</strong> <strong>do http://www.reboltech.com/library/scripts/rim.r</strong> <strong>]</strong> <strong>]</strong> |
要了解跟多REBOL脚本和头信息的资料,请参考REBOL指南的脚本一章。