首先給出原著的連接:http://www.scheme.com/tspl4/。緩存
我正在持續翻譯這本書,大概天天都會翻譯兩小時。若我我的拿不許的地方,我會附上原文,防止誤導;還有些不適合翻譯的術語,我會特地不翻譯。編碼
想看翻譯的人,能夠在下面留言。發這篇博文,就是爲了看看有多少人須要,個人翻譯有沒有公開的價值。spa
若真有人須要,我能夠把翻譯不斷分享給你們~操作系統
在此先給出一小段譯文,分享給你們。翻譯
本段譯文只在排版上於原著每段中加了些換行,別的均與原著保持了一致。指針
Chapter 7. 輸入和輸出 code
全部的輸入和輸出操做都經由 端口 執行。
端口就是(多是無限大的)數據流的指針,這數據常爲一個文件。
流是一個通路,可供程序存取字節或字符。
端口類型有:輸入端口、輸出端口、雙向端口。對象
端口是一等對象,和Scheme中的其餘對象同樣。
端口沒有供打印的表示方法(原文是have a printed representation)。
有三個內置的端口:通用輸入端口、通用輸出端口、通用錯誤端口,
分別鏈接到進程的:標準輸入、標準輸出、標準錯誤流。
語言自己提供了不少種打開新的端口的方法。進程
輸入端口每每指向有限的流,例如存儲在硬盤上的輸入文件。
若是一個輸入操做(例如:get-u8、get-char、get-datum)從一個已達有限流末尾的端口讀取,
則會返回一個特殊的 eof (end of file) 對象。
謂詞 eof-object? 能夠用來判斷輸入操做的返回值是不是eof對象。utf-8
端口類型有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)、
通用端口操做、輸入操做、輸出操做、
方便的輸入輸出、文件系統操做、字節向量和字符串的相互轉換。