翻译:ShiningRay @ NirvanaStudio
这是REBOL的一个简短概要。他在十步之内展示了REBOL的基本概念,仅仅需要阅读几分钟而已。更多的详细信息可以在 REBOL/Core Manual中找到。
1. 值(Value)
值是REBOL的未处理的数据。不同的值可以在REBOL中直接书写。你已经对他们很熟悉了。这里有一些例子:
数字:
1234
-432 3.1415 1.23E12
0,01 1,2E12
时间:
12:34 20:05:32 0:25.34
日期:
20-Apr-1998 20/Apr/1998 (US)
20-4-1998 1998-4-20 (国际通用)1980-4-20/12:32 (有时间的日期)
1998-3-20/8:32-8:00
(带着一个时区)
货币:
.34 USD.34 CAD3.45 DEM34,56
元组:
3.1.5 (版本号)
255.255.0 (颜色值)
199.4.80.7
(IP地址)
字符串:
"Here is a string"
{Here is another way to write
a string that
spans many lines
and contains "quoted"
strings.}
标签:
<title> </body>
<font size="2"
color="blue">
Email:
URLs:
http://www.rebol.com (网页)
ftp://ftp.rebol.com/sendmail.r (文件传输协议)mailto:[email protected] (email)
文件:
%data.txt
%images/photo.jpg%../scripts/*.r
号码:
#707-467-8000
(电话号码)
#0000-1234-5678-9999 (信用卡)
#MFG-932-741-A
(模型数字)
二进制:
#{0A6B14728C4DBEF5} (十六进制编码)
64#{45kLKJOIU8439LKJklj} (base-64
编码)
只要可能,REBOL允许国际通用格式的使用,像十进制数、货币和日期。更多关于值得信息可以在 REBOL/Core Manual中找到。
2. 词(Word)
词Words
是REBOL的符号。他们用来直接表示某个东西为一个词,或者间接表示为一个变量(稍后会解释)。你写词就和写英文一样的(或者和其他一些自然语言一样)。
Show next picture Carl Cindy Brenda Joe Dan Install all files here country state city street zipcode on off true false one none
破折号和一些其他的特殊字符也可以使用。他们会被认为是词的一部分。
number? time? date! image-files connection-times file-size ++ -- == +- ***** *new-line* left&right
单词的末尾被标记为一个空格,或者以下某个字符:
[ ] ( ) { } " : ; /
同样,这些字符不能出现在单词中:
/ @ # $ % ^ ,
更多关于单词的内容可以在 REBOL/Core Manual.中找到
3. 块(Block)
值和词都是在块中组合。一个块由一个’['开始,以’]'结束。你可以以任何顺序组织值和词,用任意多行代码。REBOL允许在块中以一种自由体来创建数据库、目录、表格、集合、序列、代码、函数,等等。
[white red green blue yellow orange black] ["Spielberg" "Back to the Future" 1:56:20 MCA] [ "Bill" [email protected] #315-555-1234 "Steve" [email protected] #408-555-4321 "Ted" [email protected] #213-555-1010 ] [ "John" 6894 0:55:68 "Dion" 68861 0:61:35 "Floyd" 46001 0:50:12 ]
块通常用来组织代码和数据:
if time > 10:30 [send jim news] loop 100 [print/only "*"] sites: [ http://www.rebol.com [save %reb.html data] http://www.cnn.com [print data] ftp://www.amiga.com [send [email protected] data] ] foreach [site action ] sites [ data: read site do action ]
关于块的更多信息可以查阅 REBOL/Core Manual.
4. 计算(Evaluation)
块可以被计算得到他们的值。块中的值和词都按照从左到右的顺序计算。下面的例子展示了他如何工作的,假设你是输到之REBOL的命令行。Blocks
can be evaluated to compute their results. The values and words of
the block are computed from left to right. The examples below show how this
works as if you typed into REBOL at the prompt. (Lines typed at the prompt
create a block, even though the brackets [ ] are not shown):.
print "Hello REBOL" Hello REBOL send [email protected] "Hello REBOL" color: [red green blue] pick color 3 blue loop 10 [prin "*"] ;(not a typo, see manual) ********** if today = 6-Jun-1999 [ send [email protected] "Happy 40th birthday" ] loop 20 [ wait 8:00 send [email protected] read http://www.cnn.com ] repeat count 3 [print ["count:" count]] count: 1 count: 2 count: 3
当计算块时,它的结果以一个值返回:
print do [2 + 3] 5
括号可以用来决定计算顺序:
(2 + 3) * (10 - 5) 25 (length? "boat") + 2 6
更多关于计算的内容可以看 REBOL/Core Manual.
5. 变量(Variable)
词可以用作变量。一个词后面更上冒号就可以设置它的值:
age: 22 snack-time: 12:32 birthday: 20-Mar-1997 friends: ["John" "Paul" "George"]
出现一个没有使用冒号的词,他就会被计算:
print age 22 if current-time > snack-time [print snack-time] 12:32 print third friends George
一个变量可以用来保存任何类型的值。在上面的例子中,词print,if,> third
都是存了函数的变量。他们刚好已经被REBOL预定义了,但他们在其他方面和其他词没什么区别。
变量只有在定义他们的上下文中才有意义。一个上下文可以跨越整个程序或者被严格限定在某个特定的块、对象、函数中。在下面的例子中,use函数声明一个词age。Age是一个局部变量,在这个块外面,他可能就含有别的值,但是这不会影响age在块中的值。
use [age] [ age: "young" print age ]
局部变量同时是由函数创建的,下一节就会叙述他。
更多关于变量的内容可以查阅 REBOL/Core Manual.
6. 函数(Function)
一个函数就是一个块,这种块可以有局部变量,当每次计算这个块的时候,局部变量都会被给与新的值。局部变量是函数的参数。函数可以用多种方法来创建。这里是最常见的:
sum: func [a b] [a + b]
他会新建一个函数并设置为一个词sum。第一个块描述了函数的参数,第二个块便是当调用函数的时候所计算的块(这里,他把两个值相加并返回结果)。如果要使用这个函数:
print sum 2 3 5
当调用sum函数时,a的值设为2同时b的值为3。他们被相加,结果被返回,同时结果被作为参数传给了print函数。
对于某些函数,你也许需要局部变量但不要把他们作为参数。你可以使用function代替以上情况中出现的func:
average: function [series] [total] [ total: 0 if zero? length? series [return 0] foreach value series [total: total + value] return total / (length? series) ]
这个series是参数,total是一个局部变量用来进行计算的。注意在两个地方用到了return,将结果作为函数结果返回。如果没有要返回的结果,可以使用exit。
当然,还有更多关于函数的东西可讲,请参看 REBOL/Core Manual.
7. 路径(Path)
路径指明了一个精化。他提供了一种简便的方法来指出需要更多的信息。你可能已经对他们作为文件和URL中的一部分很熟悉了。斜杠(/)是用来分隔路径中的词的。
source/images/globe.jpg http://www.rebol.com/examples/simple.r
在REBOL中,路经也可以对块、函数、对象和字符串使用:
USA/CA/Ukiah/size (block selection) match/any (function option) account/balance (object function) names/12 (string position)
下面的例子演示了使用块作为小数据库并通过路径访问的简便之处:
areas: [ Hopland [ phone #555-1234 site http://www.hopland.ca.gov ] Ukiah [ phone #555-4321 site http://www.ukiah.com email [email protected] ] ] print areas/ukiah/site http://www.ukiah.com
更多关于路径的信息可以查阅 REBOL/Core Manual.
8. 对象(Object)
一个对象是一组在特定上下文中含有值的变量。对象可以用来管理有更复杂行为的数据结构。例如,一个银行帐户可以从使用对象指定属性和方法中受益:
account: make object! [ name: "Flintstone" balance: 0 ss-number: #1234-XX-4321 deposit: func [amount] [balance: balance + amount] withdraw: func [amount] [balance: balance - amount] ]
name, balance和ss-number, deposit,以及withdraw 都是account 对象的局部变量。deposit和withdraw变量是在对象中定义的局部函数。account的变量可以通过路径来访问:
print account/balance 0.00 account/deposit 0 print ["Balance for" account/name "is" account/balance] Balance for Flintstone is 0.00
要生成其他的account,并设置一个新的balance但是其他的值保持不变:
checking-account: make account [ balance: 00 ]
你也可以通过添加一个银行名称和最后活动日期扩展已有的account对象来新建一个account:
checking-account: make account [ bank: "Savings Bank" last-active: 20-Jun-1998 ] print checking-account/balance 00.00 print checking-account/bank Savings Bank
对象还有一些别的特性,包括隐藏变量。想要发现更多内容,请看 REBOL/Core
Manual.
9. Messages消息
一个REBOL消息,简单的说,是一个从一个地方发送到另一个地方的文本文件。不管消息时在计算机之间、进程之间、还是人之间发送的——消息的形式都是一样的。他们由REBOL头开始,标示了内容、日期和其他属性:
REBOL [ Title: "Example Header" Date: 1-Sep-1998 Author: "Homer Simpson" Version: 1.0.0 Purpose: "Shows an example of a REBOL header" ]
头可以包含其他信息,由消息的目的和重要性决定。头接下来跟着的是消息的内容本身。就像上一节所显示的,他可以包含数据、代码或者两者的混合。
消息和在已有的互联网协议如http, mail
(SMTP & POP), new 和
ftp上传送。消息也可以被嵌在别的内容形式中,例如网页或者文档文件。在下面的例子,REBOL从一个网站读取一个消息并且计算它:
do http://www.rebol.com/test-msg.r Rock’n and roll’n with REBOL
这个例子通过EMAIL发送一个简短的REBOL消息:
send [email protected] read %short-msg.r
这个例子会检查每一个发送到你邮箱的消息是否从其他的REBOL程序中发出的:
foreach mail-msg email-port [ message: import email-template mail-msg if message/x-rebol [ remove mail-msg do message/content ] ]
import 函数把EMAIL消息转换成REBOL对象以便访问。如果email包含一个x-rebol行,那么它就是从REBOL发出的。
10. 方言(Dialect)
方言是携带了以不同的值和词的语法(顺序)的使用方式产生的精炼了的含义。方言一般是唯一的并且针对他们所设计解决的问题是十分合适的。
其实你已经看到了一写简单的方言。例如,一个函数的参数列表就是一种方言,除了那些已经在这里显示了的还包含很多种变体。其他的方言也可以用来分析表达式和格式化输出。
这里有一些其他方言的例子,可以用来解决特殊的问题。第一个是影像工作室控制脚本::
[queue tape to 0:36:35] [roll tape] [wait until 0:37:07] [wipe tape to image with effect 3] [key title-text]
一个图形用户界面:
button [200 100] style-4 [play cruse-narration] button [* 120] style-4 [start scene 27] window [260 100] text-80 [select window area]
足球赛程:
[team-12 plays team-32 on saturdays at 10:00] [team-12 must drive] [team-32 can play any day] [team-17 does not play on mondays]
安装脚本:
Delete base-dir if earlier modification date Create base-dir if not existing Install %editor if newer Install %crash-protect if on Win32 and is newer Install %browser but never replacing existing Switch to %threads if pre-1.2-system
这有无穷无尽的可能性。更多关于方言的介绍将会在REBOL继续开发之前几个月提供给大家。