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

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