第一章 介紹
本書介紹了Chez Scheme對(duì)Scheme [28] (R6RS) 的修訂報(bào)告6的擴(kuò)展。還包含其標(biāo)準(zhǔn)和Chez Scheme形式和過程的摘要俺猿,其中給出了每種形式的語法以及每個(gè)過程所接受的參數(shù)的數(shù)量和類型。 有關(guān)標(biāo)準(zhǔn)R6RS功能的詳細(xì)信息辽旋,請(qǐng)參見The Scheme Programming Language, 4th Edition (TSPL4) [11],或者Scheme的修訂6報(bào)告惭嚣。The Scheme Programming Language, 4th Edition還包含對(duì)Scheme語言的廣泛介紹以及眾多簡(jiǎn)短示例攒磨。
本文檔的大部分內(nèi)容也同樣適用于Petite Chez Scheme锋玲,它與完整的Chez Scheme系統(tǒng)完全兼容,但使用高速解釋器代替Chez Scheme的增量native-code編譯器盗迟。Chez Scheme編寫的程序在Petite Chez Scheme中可以運(yùn)行坤邪,只要它們不調(diào)用編譯器即可。實(shí)際上罚缕,Petite Chez Scheme與Chez Scheme的來源相同艇纺,除了編譯器來源之外,其他所有來源都包括在內(nèi)。第2.8節(jié)詳細(xì)討論了這種差別的影響黔衡。
本章的其余部分涵蓋Chez Scheme對(duì)Scheme語法的擴(kuò)展(第1.1節(jié))蚓聘,本書中用到的符號(hào)約定(第1.2節(jié)),系統(tǒng)自定義參數(shù)的用法(第1.3節(jié))以及在何處查找有關(guān)Chez Scheme的更多信息(第1.4節(jié))盟劫。
第2章介紹了如何使用Chez Scheme進(jìn)行程序開發(fā)夜牡,腳本編寫和應(yīng)用程序交付,以及如何使編譯器生成盡可能高效的代碼侣签。第3章介紹調(diào)試和對(duì)象檢查功能塘装。第4章介紹與不同進(jìn)程或用其他語言編寫的代碼進(jìn)行交互的功能。第5章介紹綁定形式影所。第6章介紹了控制結(jié)構(gòu)蹦肴。第7章介紹了對(duì)非數(shù)字對(duì)象的操作。而第8章介紹了各種數(shù)字操作型檀,包括有效的特定于類型的操作。第9章介紹了輸入/輸出操作和通用端口听盖,它們?cè)试S使用任意輸入/輸出語義定義端口胀溺。第10章討論如何將R6RS庫和頂層程序加載到Chez Scheme中,以及用于控制和跟蹤加載過程的各種功能皆看。第11章介紹語法擴(kuò)展和模塊仓坞。 第12章介紹了系統(tǒng)操作,例如與操作系統(tǒng)和自定義Chez Scheme用戶界面的交互操作腰吟。第13章介紹如何調(diào)用和控制存儲(chǔ)管理系統(tǒng)并描述守護(hù)者和弱對(duì)无埃。第14章介紹了Chez Scheme的表達(dá)式編輯器以及如何對(duì)其進(jìn)行自定義。第15章介紹構(gòu)成Chez Scheme本地線程系統(tǒng)接口的過程和語法形式毛雇。第16章介紹了各種兼容性功能嫉称。
本書的背面包含目錄,表格摘要和索引灵疮。出現(xiàn)在表格摘要中的頁碼和出現(xiàn)在索引中的斜體頁碼表示正式定義表格和程序的文本位置织阅。 表單和索引的摘要包括TSPL4中的條目,因此它們涵蓋了Chez Scheme功能的整個(gè)集合震捣。 TSPL4條目在頁碼上用“t”前綴標(biāo)記荔棉。
本書和TSPL4的在線版本和勘誤表可在www.scheme.com上找到。
致謝:Michael Adams蒿赢,Mike Ashley润樱,Carl Bruggeman,Bob Burger羡棵,Sam Daniel壹若,George Davidson,Matthew Flatt,Aziz Ghuloum舌稀,Bob Hieb啊犬,Andy Keep和Oscar Waddell都為Chez Scheme的發(fā)展做出了重要貢獻(xiàn)。Chez Scheme的表達(dá)式編輯器基于C.David Boyer從1989年到1994年開發(fā)的Scheme的命令行編輯器壁查。文件壓縮使用了Jean-loup Gailly和Mark Adler開發(fā)的zlib壓縮庫觉至。list和vector的排序例程的實(shí)現(xiàn)方式基于Olin Shiver的機(jī)會(huì)合并排序算法和實(shí)現(xiàn)。Michael Lenaghan對(duì)本書的早期草稿進(jìn)行了許多更正睡腿。本書中記錄的許多功能由當(dāng)前的Chez Scheme用戶建議语御,并且用戶的大量評(píng)論也導(dǎo)致了文本的改進(jìn)。 歡迎對(duì)Chez Scheme和本書的改進(jìn)提出其他建議席怪。
第1.1節(jié) Chez Scheme語法
Chez Scheme在對(duì)象(datum)級(jí)別和句法形式級(jí)別都擴(kuò)展了Scheme的語法应闯。Chez Scheme支持了對(duì)于字符的額外表示,其中包含非標(biāo)準(zhǔn)字符挂捻,浮點(diǎn)數(shù)和科學(xué)計(jì)數(shù)法碉纺,顯式長(zhǎng)度的vector,共享的和循環(huán)的structure刻撒,record骨田,box等等。這些擴(kuò)展將在下面描述声怔。形式級(jí)別擴(kuò)展將貫穿整本書态贤,并在《表單摘要》中進(jìn)行了總結(jié),該摘要也出現(xiàn)在本書的背面醋火。
Chez Scheme以多種方式擴(kuò)展標(biāo)識(shí)符的語法悠汽。首先,組成標(biāo)識(shí)符名稱的字符序列芥驳,可以以數(shù)字柿冲,句點(diǎn),加號(hào)和減號(hào)開頭兆旬,只要該序列不能解析為數(shù)字即可姻采。例如,0abc爵憎,+++和..在Chez Scheme中都是有效的標(biāo)識(shí)符慨亲。其次,單字符序列{ and }是標(biāo)識(shí)符宝鼓。 第三刑棵,包含任意字符的標(biāo)識(shí)符可以通過用\或|進(jìn)行轉(zhuǎn)義來打印。 \ 用于轉(zhuǎn)義單個(gè)字符('x'除外愚铡,因?yàn)閈x表示十六進(jìn)制標(biāo)量值的開始)蛉签,而 | 用于通過匹配 | 來使跟在其后的字符組轉(zhuǎn)義胡陪。例如 \||\|
是一個(gè)標(biāo)識(shí)符,具有兩個(gè)字符的名稱碍舍,由字符 | 組成柠座。|hit me! |
是一個(gè)標(biāo)識(shí)符,其名稱包含空格片橡。
此外妈经,gensyms(第7.9節(jié))上用 #{and}
括號(hào)打印,括號(hào)中同時(shí)包含“漂亮”且“唯一”名稱捧书,如:#{g1426 e5g1c94g642dssw-a}
吹泡。它們還可以使用僅包含#前綴的名字來打印,如:#:g1426
经瓷。
從2到36的任意基數(shù)爆哑,可使用前綴#nr
指定,其中 n 是基數(shù)舆吮。大小寫無關(guān)緊要揭朝,因此也可以使用#nR
。與十六進(jìn)制數(shù)字一樣色冀,將從10到35的數(shù)字值指定為小寫或大寫字母字符潭袱。 例如,#36rZZ為35×36 + 35或1295呐伞。
Chez Scheme還允許以浮點(diǎn)數(shù)或科學(xué)計(jì)數(shù)法打印非十進(jìn)制數(shù)字敌卓。例如慎式,#o1.4
等于1.5伶氢,而#b1e10
等于4.0。數(shù)字優(yōu)先于指數(shù)特定符瘪吏,因此#x1e20
僅僅是等于7712(四位數(shù)十六進(jìn)制數(shù))癣防。
除了標(biāo)準(zhǔn)命名符,#\alarm
, #\backspace
, #\delete
, #\esc
, #\linefeed
, #\newline
, #\page
, #\return
, #\space
, 和 #\tab
掌眠,Chez Scheme還識(shí)別#\bel, #\ls, #\nel, #\nul, #\rubout, and #\vt (or #\vtab)蕾盯。標(biāo)量值小于256的字符也可以用八進(jìn)制語法打印,該語法由前綴 #\
和三個(gè)八進(jìn)制數(shù)字序列組成蓝丙。 例如级遭,#\000
等效于#\nul
。
Chez Scheme的fxvectors
和fixnum vectors
渺尘,跟vectors的打印方式類似挫鸽,但使用前綴 #vfx(
代替 #
。 vector鸥跟,bytevectors和fxvectors丢郊,可以打印有明確的長(zhǎng)度前綴盔沫,并且當(dāng)指定了明確的長(zhǎng)度前綴時(shí),可以省略重復(fù)的尾隨元素枫匾。例如架诞,可以將 #(a b c)
打印為 #3(a b c)
,將包含全零的長(zhǎng)度為100的矢量打印為 #100(0)
干茉。
Chez Scheme的box
對(duì)象谴忧,打印時(shí)帶有#&
前綴,如#&17
是一個(gè)包含整數(shù)17的box等脂。
record
以 #[type-name field ...]
的語法打印俏蛮,這里的符號(hào) type-name
是record
的名字,field ...
表示 record
里的字段內(nèi)容上遥。
共享和循環(huán)的結(jié)構(gòu)可以使用圖形標(biāo)記和引用前綴 #n=
和 #n#
進(jìn)行打印搏屑。 #n=
用于標(biāo)記一個(gè)輸入里的項(xiàng), #n#
用于引用標(biāo)記為n的項(xiàng)粉楚。例如辣恋,'(#1=(a) . #1#)
是一個(gè)pair,其 car 和 cdr 包含相同列表模软,#0=(a . #0#)
是一個(gè)循環(huán)列表伟骨,即它的 cdr 是它自己。
一個(gè) $primitive
形式可像 quote
一樣能縮寫燃异,使用前綴 #%
携狭。例如,#%car
等價(jià)于 ($primitive 2 car)
, #3%car
等價(jià)于 ($primitive 3 car)
回俐。
Chez Scheme 的“文件結(jié)束對(duì)象”可打印為 #!eof
逛腿。如果“文件結(jié)束對(duì)象”出現(xiàn)在正在加載的文件中的任意數(shù)據(jù)之外,就被看做是加載到文件末尾仅颇,并在這個(gè)點(diǎn)上停止加載单默。 因此,插入#!eof
到文件之中忘瓦,可以方便追蹤加載時(shí)的錯(cuò)誤搁廓。
在弱對(duì)(點(diǎn)擊查看詳情)中的損壞指針表示為“broken weak pointer object”,打印為#!bwp
耕皮。
除了標(biāo)準(zhǔn)分隔符(空白境蜕,開閉圓括號(hào),開閉方括號(hào)凌停,雙引號(hào)粱年,分號(hào)和 #),Chez Scheme還將開括號(hào)苦锨,單引號(hào)逼泣,后引號(hào)和逗號(hào)視為分隔符趴泌。
在輸入流中出現(xiàn) #!r6rs
注釋指令后,上述的Chez Scheme的詞法擴(kuò)展將被禁用拉庶,除非在之前出現(xiàn) #!chezscheme
注釋指令嗜憔。每個(gè)通過 import
隱式加載的庫,以及每個(gè)通過 --program
命令行選項(xiàng)的RNRS頂層程序或 load-program
程序氏仗,都被視為隱式以 #!r6rs
注釋指令為開頭吉捶。
根據(jù)修訂版報(bào)告6的要求,符號(hào)和字符名稱的大小寫通常很重要皆尔。在相同的輸入流里呐舔,#!fold-case
注釋指令將名稱設(shè)置為小寫,就像被 string-foldcase
處理過一樣慷蠕,除非之前出現(xiàn) #!no-fold-case
珊拼。沒有出現(xiàn)任何指令時(shí),且 參數(shù) case-sensitive
被設(shè)置為 #f 時(shí)流炕,名字也是小寫的澎现。
通過 write
, put-datum
, pretty-print
, 和 format ~s
選項(xiàng),printer 總是用標(biāo)準(zhǔn)語法每辟,對(duì)標(biāo)準(zhǔn)的修訂報(bào)告6的對(duì)象進(jìn)行打印剑辫。除非通過設(shè)置某個(gè)打印參數(shù),來改變默認(rèn)行為渠欺。例如妹蔽,上述的Chez Scheme的擴(kuò)展標(biāo)識(shí)符語法的符號(hào),printer 將使用的十六進(jìn)制標(biāo)量值轉(zhuǎn)義序列來打印挠将,除非 print-extended-identifiers
被設(shè)置為 true胳岂。同樣地,printer 不會(huì)打印顯式長(zhǎng)度或省略尾部的重復(fù)元素捐名,除非設(shè)置 參數(shù)print-vector-length
為 true旦万。
第1.2節(jié) 符號(hào)約定
本書基本上遵循與The Scheme Programming Language 第4版 相同的符號(hào)約定闹击。下面重申這些約定镶蹋,并附帶Chez Scheme特定的注釋。
當(dāng)說一個(gè)過程或句法形式產(chǎn)生的值是 未定義 時(shí)赏半,該形式或過程或許返回任意數(shù)量的值贺归,每個(gè)都可以是任意 Scheme 對(duì)象。只要返回結(jié)果是 未定義 断箫,Chez Scheme
通常返回唯一一個(gè) void 對(duì)象(參見 void)拂酣;但是,請(qǐng)避免參考這個(gè)對(duì)象仲义,尤其是當(dāng)你的程序要移植到另一個(gè)Scheme實(shí)現(xiàn)時(shí)婶熬。Chez Scheme 的 waiter (讀-求值-打印循環(huán)剑勾,REPL) 會(huì)禁止打印空對(duì)象。
本書使用“必須”和“應(yīng)該”此類詞語來描述程序的條件赵颅,例如調(diào)用 vector-ref
的條件是提供一個(gè)小于vector長(zhǎng)度的下標(biāo)虽另。如果使用“應(yīng)該”一詞,則意味著該條件由實(shí)現(xiàn)強(qiáng)制執(zhí)行饺谬,即拋出一個(gè)異常捂刺,該異常通常是條件類型 &assertion
。如果使用了“應(yīng)該”一詞募寨,那么異匙逭梗可能會(huì)也可能不會(huì)被拋出。如果未拋出拔鹰,該程序的行為是未定義的仪缸。短語“語法沖突”用于描述程序格式錯(cuò)誤的情況。檢測(cè)語法沖突先于程序執(zhí)行列肢。當(dāng)檢測(cè)到語法沖突時(shí)腹殿,會(huì)拋出 &syntax
類型異常,并停止執(zhí)行例书。
顯示在屏幕字體上的 Scheme 對(duì)象锣尉,就像是在鍵盤上鍵入的一樣。這包括標(biāo)識(shí)符决采,常量對(duì)象自沧,括號(hào) Scheme 表達(dá)式,和整個(gè)程序树瞭。斜體字體用于在句法形式的描述中襯托語法變量拇厢,在過程中描述中襯托參數(shù)。當(dāng)一個(gè)技術(shù)用語首次出現(xiàn)時(shí)晒喷,也用斜體字來作襯孝偎。標(biāo)識(shí)符的首字母通常不會(huì)大寫,即使出現(xiàn)在句首也不會(huì)大寫凉敲。這對(duì)寫作斜體字的句法變量來說也是一樣的衣盾。
在句法形式或過程的描述中,用模版來顯示了句法形式或過程的應(yīng)用爷抓。 語法關(guān)鍵字或過程名稱以打字機(jī)字體給出势决,括號(hào)也是如此。語法或變量的其余部分以斜體顯示蓝撇,其使用的名稱暗含了語法形式或過程所期望的表達(dá)式或變量的類型果复。省略號(hào)用于聲明子表達(dá)式或參數(shù)出現(xiàn)零次或多次。
第1.3節(jié) 參數(shù)
Chez Scheme的所有系統(tǒng)定制都是通過參數(shù)來完成渤昌。一個(gè)參數(shù)是一個(gè)封裝著內(nèi)部狀態(tài)變量的過程虽抄。當(dāng)不帶參數(shù)調(diào)用此過程時(shí)走搁,它返回封裝的變量值。如果它的參數(shù)不正確迈窟,則可能會(huì)引發(fā)異常朱盐,也可能會(huì)以某種方式過濾該參數(shù)。
運(yùn)行在Chez Scheme的程序可能會(huì)創(chuàng)建和使用新的參數(shù)菠隆。使用參數(shù)而不是全局變量進(jìn)行程序自定義有兩個(gè)原因:首先兵琳,無意中重新定義一個(gè)自定義變量,會(huì)導(dǎo)致意外的問題骇径,而無意中重新定義參數(shù)只會(huì)使參數(shù)不可訪問躯肌。例如,在Chez Scheme的早期版本中破衔,一個(gè)程序?yàn)榱俗约旱哪繕?biāo)而定義了 *print-level*
清女,對(duì)Scheme對(duì)象的打印產(chǎn)生了意想不到的影響。而為了自己目標(biāo)而定義 print-level
晰筛,只會(huì)失去改變打印機(jī)行為的能力嫡丙。當(dāng)然,一個(gè)意外調(diào)用 print-level
的程序依然會(huì)以意想不到的方式影響系統(tǒng)读第,但這種情況不太可能發(fā)生曙博,并且只能在不正確的程序中發(fā)生。
其次怜瞒,當(dāng)“賦值”完成時(shí)父泳,參數(shù)的無效值可以立即檢測(cè)并拒絕,而不是在第一次使用時(shí)吴汪,這時(shí)撤銷和恢復(fù)舊值為時(shí)已晚惠窄。例如,將 *print-level*
賦值為 -1 漾橙,該錯(cuò)誤行為不會(huì)被捕獲杆融,直到第一次調(diào)用 write
或 pretty-print
時(shí)已為時(shí)已晚。而嘗試將 -1 賦值給參數(shù) print-level
霜运,即 (print-level -1)
脾歇,在實(shí)際進(jìn)行更改之前立即被標(biāo)記為錯(cuò)誤。
系統(tǒng)內(nèi)置參數(shù)的介紹將貫穿本書的不同章節(jié)觉渴,并在本書背面的“表格摘要”中列出了其他語法格式和過程介劫。在Chez Scheme的線程版本中徽惋,標(biāo)記為“線程參數(shù)”的參數(shù)具有每個(gè)線程的值案淋,而標(biāo)記為“全局參數(shù)”的參數(shù)的值由所有線程共享。 Chez Scheme的非線程版本不區(qū)分線程參數(shù)和全局參數(shù)险绘。有關(guān)創(chuàng)建和操作參數(shù)的更多信息踢京,請(qǐng)參見 12.13節(jié) 和15.7節(jié)誉碴。
第1.4節(jié) 更多信息
下面列出的文章和技術(shù)報(bào)告記錄了Chez Scheme的各種功能及其實(shí)現(xiàn):
- 句法抽象 [14, 8, 17]
- 模塊 [32]
- 庫 [21]
- 儲(chǔ)存管理[12, 13]
- 線程[10]
- 多返回值[2]
- 可選參數(shù)[16]
- 延續(xù)[7, 25, 3]
- eq? 哈希表[20]
- 內(nèi)部定義,letrec 和 letrec* [33, 22]
- equal? [1]
- 引擎[15]
- 浮點(diǎn)打印[4]
- 代碼生成[18]
- 寄存器分配[6]
- 內(nèi)聯(lián)過程[31]
- 分析[5]
- 實(shí)現(xiàn)的歷史[9]
這些出版物的摘要和電子版本的鏈接可從以下網(wǎng)址獲得:http://www.cs.indiana.edu/chezscheme/pubs/瓣距。