首先給出原著的鏈接:http://www.scheme.com/tspl4/。
我正在持續翻譯這本書,大概每天都會翻譯兩小時。若我個人拿不准的地方,我會附上原文,防止誤導;還有些不適合翻譯的術語,我會特意不翻譯。
想看翻譯的人,可以在下面留言。發這篇博文,就是為了看看有多少人需要,我的翻譯有沒有公開的價值。
若真有人需要,我可以把翻譯不斷分享給大家~
在此先給出一小段譯文,分享給大家。
本段譯文只在排版上於原著每段中加了些換行,別的均與原著保持了一致。
Chapter 7. 輸入和輸出
所有的輸入和輸出操作都經由 端口 執行。
端口就是(可能是無限大的)數據流的指針,這數據常為一個文件。
流是一個通路,可供程序存取字節或字符。
端口類型有:輸入端口、輸出端口、雙向端口。
端口是一等對象,和Scheme中的其他對象一樣。
端口沒有供打印的表示方法(原文是have a printed representation)。
有三個內置的端口:通用輸入端口、通用輸出端口、通用錯誤端口,
分別連接到進程的:標准輸入、標准輸出、標准錯誤流。
語言本身提供了很多種打開新的端口的方法。
輸入端口往往指向有限的流,例如存儲在硬盤上的輸入文件。
如果一個輸入操作(例如:get-u8、get-char、get-datum)從一個已達有限流末尾的端口讀取,
則會返回一個特殊的 eof (end of file) 對象。
謂詞 eof-object? 可以用來判斷輸入操作的返回值是否是eof對象。
端口類型有binary和textual。
binary端口允許程序於流中讀寫8-bit無符號字節、"octets,"。
textual端口允許程序讀寫字符。
很多時候,流被組織成字節序列, 但這些字節其實是字符的編碼。
此時,可以借助transcoder創建textual端口,從而在輸入時將字節解碼成字符、在輸出時將字符編碼成字節。
transcoder內封裝了codec,它確定了字符如何表示成字節。
有三個標准的codec:latin-1 codec, Unicode utf-8 codec, Unicode utf-16 codec。
在 latin-1 中,每個字符用一個字節表示。
在 utf-8 中,每個字符用一到四個字節表示。
在 utf-16 中,每個字符用兩個或四個字節表示。
transcoder內還封裝了eol style,用來確定 識別哪種 以及 如何識別 行尾標志。
如果 eol style 是 none,那么不識別任何一種行尾標志。
另外六個標准 eol styles 如下所示:
lf: | line-feed 換行字符 |
cr: | carriage-return 回車字符 |
nel: | Unicode next-line C-n字符 |
ls: | Unicode line-separator 行分割字符 |
crlf: | 換行字符+回車字符 |
crnel: | C-n字符+回車字符 |
不同的 eol style 下,輸入輸出操作也會不同。
輸入時,除 none 之外的所有 eol style 下,均會將 各種行尾標志 轉換為 單換行字符。
輸出時,除 none 之外的所有 eol style 下,均會將 換行字符 轉換為 各自風格的行尾標志。
在輸入方向,除 none 之外的所有 eol style 都是等價的;
而在輸出方向,則只有 none 和 lf 是等價的。
除了 codec 和 eol style,transcoder內只還封裝了一塊信息:error-handling模式, 確定了當編碼解碼錯誤出現時,會如何處理。
例如,在輸入方向上,用封裝的 codec 無法將一個字節序列轉換成字符;
或者,在輸出方向上,用封裝的 codec 無法將一個字符轉換成字節序列。
error-handling模式有:ignore, raise, replace。
在 ignore 模式下,出錯的字節序列或字符會被忽略。
在 raise 模式下,會拋出一個異常,類型是:i/o-decoding 或 i/o-encoding;
在輸入方向,端口定位到字節序列之后。
在 replace 模式下,會產生一個替換的字符或字符編碼:
在輸入方向,替換字符是 U+FFFD,
而在輸出方向,替換字符則如下:
當 codec 為 utf-8 或 utf-16 時,替換字符是 U+FFFD;
當 codec 為 latin-1 時,替換字符則是 問號字符 ( ? )。
為了效率,端口會有緩存機制, 從而消除向操作系統逐字節或字符取用的開銷。
標准的buffer模式有三個:block、line、none。
在block模式下,將輸入輸出流分成很多塊分別操作,每塊流的大小與實現相關。
在line模式下,緩存將構建成一行一行的,或者是實現相關的大小。
上面這兩種模式,僅在 textual輸出端口 中有明顯區別;
因為 binary端口 中並不分行,而 輸入 則往往在流開始可讀時便直接讀取了。
在none模式下,沒有緩存,因此會直接輸出到流中,也僅在需要時才去輸入。
本章余下的內容有:
transcoder上的操作、
文件端口、標准端口、字符串和字節向量端口、自定義端口(custom ports)、
通用端口操作、輸入操作、輸出操作、
方便的輸入輸出、文件系統操作、字節向量和字符串的相互轉換。