今日不小心走進了圖書館,本來想借一本Python編程的書,結果偶然看到有一本《Java夜未眠》沒有被借走,翻了幾頁感覺寫的不錯,再一看是蔡學鏞著,原來是蔡老師的書,索性借回來讀,發現蔡老師在書里邊拿出一個段落來講一種名叫Rebol的語言,號稱是互聯網語言,既然是互聯網語言,我就感興趣了,在IBM developerWorks上看了一篇入門教程,覺得這個語言跟其他語言很不一樣,索性摘錄下來跟有興趣的朋友分享。
紅字部分是我的標注。
-----------------------------------------------------
Rebol入門教程
[from ibm developerWoks]第一章為教程提示 略去第二章 介紹Rebol
如何描述 Rebol 語言?革命性的,功能強大的,靈活的 -- 而且是不同的。事實上,Rebol 可能不象您以前用的任何一種語言。在用一種直接的同時也是“非常規”的方式來設計解決實際編程任務方面,Rebol 為那些想在腳本語言中尋求更多的編程者提供了一個嶄新的編程工具箱。
對于我們開發者而言,學習 Rebol 可以給予我們新的活力和富有挑戰性。在承諾有些完全不同的同時,Rebol 還使用了新的編程模式,在與大多數傳統語言使用的有些相似的同時,又是“如此不同”以至于經驗豐富的開發者都感到困惑。
在許多方面 Rebol 是與眾不同的。它使用自然的類英語語法,且支持許多數據類型,象 URL 和電子郵件地址。Rebol 是一種支持因特網的語言;使用 Rebol, 可以用一行簡單的代碼實現下載 Web 頁面或者發送一條電子郵件消息。不但如此,Rebol 還提供稱之為“dialecting”的高級功能,此功能允許您創建用于您自己特殊目的的子語言,特別為您使用 Rebol 的任務定制。
然而,在您接觸這些招人喜愛的特性之前,掌握 Rebol 的基礎知識是很重要的。這就是在本教程中我們將要做的。在您熟練掌握這些基礎知識后,我將給您展示一些在線資源,使您了解 Rebol 的更先進特性。
從訪問 http://www.rebol.com 來開始使用 Rebol。在本教程中,我們將使用 Rebol 的基本版本 -- 稱為 Rebol/Core,它適用于大約 40 種不同平臺。雖然我們僅涉及 Linux 的安裝,但本教程中與 Rebol 相聯系的部分適應于每個平臺。進入 http://www.rebol.com 后,選擇開發者部分,然后單擊“Downloads”。選擇可用于您平臺上的 Rebol/Core 的最新版本。目前,有以下一些版本可用:libc5、libc6 x86 Linux、Linux/Alpha、Linux/PPC、Linux/Sparc、UltraSparc、Linux/StrongARM、 MIPS 和 68K! 很顯然,在 Rebol 的移植方面 ,其開發者花了很大的心血。
對于 libc6 x86 Linux,Rebol/Core 檔案標志為“core042.tar.gz”。在下載完您所需的文檔后,創建一個“rebol”目錄,并將此文檔放至該目錄下。進入該目錄,輸入
$ tar xzvf core042.tar.gz
將此文檔解包。五個文件將解包到當前目錄,這其中包括 rebol 可執行文件。
輸入
$ ./rebol
啟動 Rebol。您將看到類似于以下情況:

在這里,您將要配置系統中網絡方面的選項,包括輸入您的電子郵件地址、SMTP 和 POP 服務器以及網絡代理的設置。由于 Rebol 是支持因特網的語言,它需要這些設置選項以訪問因特網。
(這里新的版本(2.6.2)已經不需要了,只有執行do setup.r才會進入配置過程)
在你完成配置步驟后,Rebol 會詢問在當前目錄是否允許創建“user.r”文件。您的設置將存儲在這個文件中。繼續,并說 "Y"。這是 Rebol 的內置安全性支持的一個例子。
下次啟動 Rebol 時,記住要從“rebol”所在目錄啟動。這樣的話,Rebol 將會找到 user.r 文件,并且自動裝入網絡設置。
在完成配置后,您處在交互式 Rebol 解釋器內部。Rebol 提示符類似于:
>>
繼續,輸入“help”并敲入 Enter 鍵來查看 Rebol 的內置幫助頁。“help”命令也能接受變量。嘗試輸入“helpprint ”。您將在屏幕上看到 print 函數的摘要。
精確地講,有哪些可用的 Rebol 函數?為了查看完整的列表,在提示符下輸入"what":
>>what
"what" 命令顯示了一個所有全局定義的函數列表。
最必不可少的 Rebol 命令之一 -- quit。如果要離開解釋器,簡單地輸入:
>> quit
....您將返回到 shell 提示符。既然知道了如何進入和退出解釋器,現在該是熟悉語言本身了。
第三章 Rebol-語言
Rebol 的出色之一是它有大量內置的數據類型,這些已設計成反映您在現實世界中發現的數值,如電子郵件地址、URL、日期、時間和貨幣值。讓我們開始熟悉它們。
在 Rebol 提示符下,輸入:
>> drobbins@gentoo.org
== drobbins@gentoo.org
這個電子郵件地址送給解釋器后,Rebol 僅把它的重復返還回來。這是 Rebol 的標準處理方式 -- 當文字值輸入給解釋器時,它將該值重復返回。現在您也許想知道 drobbins@gentoo.org 是什么類型的值。大多數語言將電子郵件地址作為字符串處理,所以也可能猜想 Rebol 亦是如此。然而,您會驚奇地發現 Rebol 所作的比這更有用。
為了看 drobbins@gentoo.org 是什么數據類型,輸入:
>> type? drobbins@gentoo.org
== email!
字 type? 是接受變量的函數,它返回變量的數據類型。正如您所見,Rebol 事實上認識 drobbins@gentoo.org 是一個電子郵件地址 -- 很不可思議!我們不需要特殊的語法去指定電子郵件地址;Rebol 可以將該值識別成電子郵件地址,因為它注意到嵌入的"@"字符。
讓我們繼續。輸入
>> type? $5.00
== money!
同樣,Rebol 認識 $5.00 表示貨幣值。
您可能想知道為什么在 email!和 mony!后面有驚嘆號。答案很簡單 -- 所有數據類型名稱以一個驚嘆號結尾。除此之外,查詢屬性的函數以問號標記結尾(如 type? 函數)。Rebol 通過構造類似于傳統書寫語言(如 English)的語法,來使其更具用戶友好性。
試著輸入以下 Rebol 表達式,來看 Rebol 所識別的數據類型的每個值:
>> type? 1
>> type? 1.0
>> type? "foo"
>> type?
{foo}
>> type? http://www.gentoo.org
>> type? true
>>
type? yes
>> type? :print
>> type? money!
第四章 Rebol字
如 C 語言的變量能代表數據一樣,Rebol 有它自己的變量,稱之為字。這里有一個如何將字與數值聯系在一起的示例。
>> myval: $5.00
注意冒號后邊要有空格。
在這個示例中,myval 一直與值 $5.00 相關聯。在表達式中用 myval 會立即求出值:
>> myval
== $5.00
>> myval + 1
== $6.00
在 Rebol 中,將字與值聯系起來是很普遍的,創建一個字/值對。字也是不區分大小寫的,所以輸入 myval 與 MyVal 是一樣的
現在嘗試輸入任何舊字到解釋器。會出現如下錯誤信息:
>> foo
** Script Error: foo has no value.
** Where: foo
缺省情況下,Rebol 會自動對所有字求值。通過"求值"Rebol 將自動用字所關聯的值來替換字。如果字沒有與值關聯,那么 Rebol 返回錯誤。
基于現有字的值,我們也可以定義新的字。嘗試這個示例:
>> myval: $5.00
== $5.00
>> myval2: myval + 1
== $6.00
>>
myval2
== $6.00
>> myval
== $5.00
>> myval: myval + 1
==
$6.00
>> myval2
== $6.00
這里,我們基于 myval 定義 myval2。然后,增加 myval 的值,并打印 myval2 的值,發現 myval2 的值沒有更改。
正如您所見,Rebol 字充當了如 C 和 C++ 語言中變量的功能。您可能甚至想知道為什么 Rebol 的開發者稱 Rebol 的變量為字,而不是遵循標準的術語。問得好!這正是本教程下面要講的,我將演示 Rebol 字與標準 C 變量所不同的獨一無二的特征。
當 Rebol 解釋器遇到字,它正常的反應是將它求值。當字被求值時,它被其關聯的值所替換。所以,譬如,如果字 myemail 與值 drobbins@gentoo.org 相關聯,那么在 Rebol 解釋器提示符下輸入:
>> myemail
....將使解釋器返回:
== drobbins@gentoo.org
這是 myemail 的值。這表明,根據 Rebol,字 maemail 有含意,它代表了 drobbins@gentoo.org 這個電子郵件地址。這會很明顯,Rebol 讓您用字能作一些不尋常的事,呆一會兒我們會看到。
當我們在幾屏前使用美圓金額時,用標準的算術運算符 +。當然,Rebol 支持整套算術運算符,包括標準的 +、 -、 *、和 /。除此之外,它還包含 // 余數運算符。
當您在 Rebol 中寫數學表達式時,您需要知道兩件重要事情。首先,在值與運算符之間要放空格;解釋器不能正確分析 1+7 ,而 1 + 7 可以。其次,Rebol 從左到右對算術表達式求值。它沒有象 C 中特殊的運算符優先權。如果您想顯式的表明算術求值的順序,可以用括號將表達式括起。(這一點要注意哦)
除了標準的"中綴"(在當中)算術運算符,Rebol 也有內置的算術運算符。以下是它們的工作原理:
>> abs -23
== 23
>>add 23509 230
== 23739
>>divid 4
2
== 2
>>multiply 30 30
== 900
>>remainder 9 4
== 1
>>
subtract 4 9
== -5
Rebol 對日期也有極好的內置支持。要獲取當前日期,用字"now":
>> print now
30-Sep-2000/22:41:19-6:00
通過在日期上加上或減去一個整數,可以偏移該日期一定天數。譬如,可以表示兩周前的日期:
>> print now + 14
14-Oct-2000/22:43:13-6:00
用now: 3可以把now變成3,如果要恢復過來就不知道怎么做了,不過幸好我前邊用timenow: now + 3,然后又用 now: timenow? - 3 恢復過來了,好險啊,吼吼
Rebol 有相當多的數據類型;我們這里沒有篇幅來涵蓋所有數據類型;這里有一個數據類型的部分列表:整數、小數、時間、日期、貨幣、邏輯、字符、空值、字符串、二進制、電子郵件、文件、url、issue、元組、標記、塊、散列、列表、路徑和字。
許多數據類型都有它自己特殊的運算符和函數,且數據類型可以以無數種方式進行交互。譬如,您可以從數據中抽取時間;附加到字符串;打開、關閉和寫入文件。在 Rebol 用戶手冊(更詳細信息請參閱 參考資料)詳細描述了有關所有這些數據類型和它們相關聯的運算符和函數.
第五章 字和表達式
以前,當對 myemail 求值時,Rebol 解釋器將"==drobbins@gentoo.org"寫到屏幕上。當交互使用解釋器時,Rebol 打印任何已求值的表達式。然而,當 Rebol 代碼從文件執行時(不用解釋器,而作為一個 shell 腳本),將不能看到上面的輸出。在這種情形下,應該用 print 命令生成輸出。也可以交互使用打印:
>> print myemail
drobbins@gentoo.org
Rebol 顯示了 myemail 的值,但不打印"==drobbins@gentoo.org"。這是因為 print 將 email 的值輸出到屏幕,而不是返回值本身。
有時想將字的值打印到屏幕,但也想在字的值上執行附加的處理。譬如,可以輸入:
>> print myemail
drobbins@gentoo.org
>> type? myemail
==
email!
這里有一些訣竅,Rebol 提供了一種更清晰的方式來立即執行這兩個步驟...
簡單地輸入:
>> type? probe myemail
drobbins@gentoo.org
== email!
probe 字期望單個字或塊(后面將講述)作為變量。它將打印該字的值,并返回該字的值。在這個示例中,type? word 隨后對該值求值,顯示 drobbins@gentoo.org 值的類型。可以認為 probe 是標準 UNIX "tee"命令的 Rebol 版。
大多數時間,當我們引用 Rebol 的字時,Rebol 能做我們想做的 -- 對字求值,將值傳給函數或在交互式解釋器上顯示該值。然而,有時這并沒有精確到我們想要做的。有時當我們想引用字本身,而不是它所關聯的字。對于這種情形,Rebol 提供了一個方便的文字字語法。看一下這個示例:
>> type? myemail
== email!
>> type? 'myemail (只要是以單引號開頭的,Rebol都認為是字(word))
== word!
為了幫助您掌握文字的字的概念,您要大聲地說(用嘴,用 English 或您熟悉的語言!)代碼所正在做的。是的,這意味著您盯著監視器時要自言自語。不要害怕 -- 如果您對這種事情感到很困窘,那您就假裝是 Jean Luc Picard (USS Enterprise 的 Captain),您正在大聲對計算機發命令。
這個練習的關鍵是,當您看到象這樣寫的字:
foo
....您應該說"foo"。
當您看到象這樣寫的字:
'foo
....您應該說"the word foo"。
第一條命令
這里有一個您已經輸入到 Rebol 解釋器的命令:
>> myemail: drobbins@gentoo.org
如果您是 Jean Luc Picard,您也不會使用和計算機鍵盤一樣過時的東西來輸入這個命令。事實上,您會大聲地說(提示):
"Computer,associate the word myemail with the valuedrobbins@gentoo.org."
作為 Jean Luc Picard,不要用鍵盤輸入這些怪異的東西,小心會得腕骨綜合癥:
>> myword: 'myemail
....您要從專門設計的 Captain 椅起來,發號施令:
"Associate the word myword with the word myemail"
注意到不同嗎?有點微妙差異但很重要。前綴 ' 意味著您正在談論 the word。沒有 ',意味著正在談論字的值。
現在,有一個叫 myword 的字,它有個值是它本身(也是字)。好,這很有意思,您如何告訴 Rebol 去求該字的值?很容易:
>> do myword
== drobbins@gentoo.org
棒極了!現在,當 Rebol 求字值時,我們能夠精確地控制它了。
十分感謝 do 函數,我們也可以輸入:
>> do 'myemail
== drobbins@gentoo.org
然而,這沒有什么意義,因為僅輸入字本身也能實現同樣的結果:
>> myemail
== drobbins@gentoo.org
字與值相關聯有另一種方法。除了輸入:
>> myvar: $5.00
也可以輸入:
>> set 'myvar $5.00 (這里有引號)
這兩種表達式的效果是相同的。大聲朗讀它們 "set the word myvar to the value $5.00"。set 字展開了許多強大的可能性。
考慮:
>> myword: 'cost
== cost
>> set myword $5.00
== $5.00
最后的表達式事實上不影響字 myword 的值;它將 cost 與值 $5.00 關聯。(如果不相信我,那就輸入 "print cost"。)您可以大聲地朗讀最后一行 "set the value of myword to $5.00" 或 "set the word cost to $5.00"。由于 myword 的值是字 cost,這兩個句子表示同樣的事。
字可以設置,也可以取消設置:
>> unset 'cost
這將取消與字 cost ('cost) 關聯的值。如果在該命令之后,立即輸入 "print cost",會返回錯誤,因為 cost 沒有值。有興趣的話,嘗試輸入 "print cost"。
即使字 cost 不再有任何值,下面的代碼不會產生錯誤:
>> print 'cost
cost
這是因為執行了命令 "print the word cost"。print 函數首先打印字的名稱,而不是它的值。' 字符防止 cost 被求值。
在自動確定文字值的類型方面,Rebol 很在行。有時在沒有足夠信息的情況下,Rebol 不能自動指出特定的值是什么類型。譬如,有這樣一種情形
,我想設置字 myemail 以便它與電子郵件地址 "drobbins" 關聯。您可以試圖輸入:
>> myemail: drobbins
不幸的是,這不起作用。解釋器沒有辦法知道 "drobbins" 是什么。Rebol 沒有找到嵌入在字符串中的 "@",所以它認為 drobbins 是一個常規字,并對它求值。不幸的是,字 drobbins 沒有與它相關聯的值,因此出現這種錯誤。
** Script Error: drobbins has no value.
** Where: myemail: drobbins
幸運的是,有這樣一種變通方法。不是輸入:
>> myemail: drobbins
....而是輸入:
>> myemail: make email! "drobbins"
沒有錯誤,如果查詢 myemail 的類型,我們會看到所期望的結果:
>> type? myemail
== email!
make 函數允許我們創建特定類型的值。我們指定類型,而不是依靠 Rebol 去試圖檢測我們的數據類型。
make 函數的第一個變量應該是數據類型,象 money!、email! 或 url!。第二個變量應該是包含您要創建的值的字符串。只要指定一個有效的字符串,make 將精確地創建您想要的值。如果指定一個無效的字符串,將會出現錯誤的信息。您能夠看到 Rebol 拒絕該請求,其理由很充分:
>> mymoney: make money! "drobbins"
** Script Error: Invalid
argument: drobbins.
** Where: mymoney: make money! "drobbins
第六章 塊
現在來看一下稱之為塊的 Rebol 構造。在 Rebol 中,可以用塊來組織數據的集合。用 [ 和 ] 將一組值括起來創建塊。
>> myblock: [ this and that ]
== [this and that]
塊的靈巧之一是它們能包含數據和代碼。它們能包含不關聯值的字,并且塊的內容是不立即求值的。譬如,Rebol 接受 myblock 的定義,即使字 this and that 沒有值。
可以在塊中插入代碼,如下:
>> mycode: [ print "foo" ]
== [print "foo"]
用方便的 do 函數來執行該代碼:
>> do mycode
foo
這里有一個當執行時實際上不做任何事情的代碼塊,但它演示了 Rebol 的特性:
>> mydata: [ 1 2 3 ]
== [1 2 3]
這看上去象數據塊,但我們也能把它當作代碼來執行。作為代碼,這個塊包含了三個獨立的表達式,1、2 和 3。每個表達式都各自返回 1、2 和 3 的值。現在讓我們來執行這個塊。
>> do mydata
== 3
正如您所見,Rebol 返回在代碼中遇到的最后一個值。然而,整個代碼塊是按照順序來執行的,不是僅指最后的元素。
塊可以嵌套:
>> instructions: [
[ [ remove hard drive from chassis ]
[ [ throw hard drive out window ]
[ [ scream "foo foo foo!" ]
[ ]
從第二行開始到第五行的 [ 字符實際上是 Rebol 提示符。這是 Rebol 提醒我們正在進入多行塊的方式。嘗試將該塊輸入解釋器,您就能看到我所說的。
執行結果是:== [scream "foo"]
?
我們可以訪問塊中的元素:
>> myblock: [ jimmy cracked corn ]
== [jimmy cracked corn]
>> first myblock
== jimmy
>> myblock/1
== jimmy
>> last myblock
== corn
>> myblock/3
== corn
>> myblock/2
== cracked
我們也可以將帶值的字(用作鍵)配成對,并用字作為塊的索引:
>> order: [
[ amount 10
[ cost $3.50
[ email
drobbins@gentoo.org
[ ]
== [
amount 10
cost $3.50
email drobbins@gentoo.org
]
>> order/email
== drobbins@gentoo.org
>> order/cost
== $3.50
注意到 order 塊包含六個獨立的字,字 amount 不與任何值關聯(我們沒有輸入 "amount:10",而是輸入 "amount 10",這是兩個毫不相關的字)。"order/cost" 稱為路徑.
第七章 參考資料
管在本教程中我們已經講了許多,但我們僅觸及了 Rebol 編程語言的表面。為了進一步深入下去,推薦您下載 Rebol 用戶指南。它編寫得很好,很透徹。現在您已經了解了 Rebol 的基本知識,也就不難理解這本書。為了讓 Rebol 自動下載用戶指南,輸入:
>> do do http://www.rebol.com/users-guide.r
Rebol 將問您是否在磁盤上創建該文件。僅需點擊 A(代表“所有”),“Rebol 用戶指南”將自動地下載到您目前的工作目錄下!很簡便,不是嗎?(這個被證實已經找不到users-guide.r了)
如果想得到其他的開發者參考資料,在常規選項的基礎上,選取 http://www.rebol.com 上開發者部分的復選框。這里有許多(大量)郵件列表和各種各樣免費的 Rebol 介紹性和媒體的文章。希望您喜歡這篇文章,您還要豐富您的 Rebol 知識!
posted on 2006-06-18 00:34
rd2pm 閱讀(5651)
評論(6) 編輯 收藏 所屬分類:
web develop