The Scheme Programming Language 读书笔记,chapter 7.
Chapter 7. Input and Output
所有的IO操作都是通过ports来完成的。Port是一个指向数据流的指针。一个Port可以是只为输入服务,或者只为输出服务的,或者同时为输入和输出服务的。
Port也是第一等级的对象。port没有像字串或者数值那样的可打印形式。初始情况下有三个port:current input port, current output port, standard error port。
Port也可以是二进制的,或者是文本格式的。二进制port允许按8位无符号字节读写数据流;文本格式的port允许按字符读写数据流。文本流常常涉及到格式转化,即transcoder。三种标准的转码格式:latin-1, utf-8, utf-16。
转码器封装了eol样式用于区分不同过的换行。如果eol样式为none,那么不会识别换行。下面是其他可选的eol样式:
- lf, line-feed
- cr, carriage-return
- nel, Unicode next-line
- ls; Unicode line-separator
- crlf, carriage return连着line-feed
- crnel, carriage return连着next-line
对于输入流,none以外的eol样式会将识别的字符们转化为单个line-feed。对于输出流,none以外的eol样式会将line-feed转化为对应的行尾。另外对于输入流来说,除none以外的所有的eol样式都是相等的;对于输出流来说,none和lf是等效的。
除了codec和eol以外,转码器还对应着另一个信息:错误处理模式,用于在编解码出错的时候给出具体的错误处理行为。如果错误处理模式为ignore,那么错误会被忽略;如果是raise,那么会抛出i/o-decoding或者i/o-encoding异常;如果是replace,那么会将错误的字符替换成U+FFFD,如果是输出方向,还可以将替换字符设成对应编码条件下的?
。
port可以设置不同的缓冲类型,比如none, line以及block。
Section 7.1. Transcoders
相关执行诀:
(make-transcoder codec)
(make-transcoder codec eol-style)
(make-transcoder codec eol-style error-handling-mode)
(transcoder-codec transcoder)
(transcoder-eol-style transcoder)
(transcoder-error-handling-mode transcoder)
(native-transcoder)
(latin-1-codec)
(utf-8-codec)
(utf-16-codec)
(eol-style symbol)
, symbol must be one of the symbols lf, cr, nel, ls, crlf, crnel, or none(native-eol-style)
(error-handling-mode symbol)
, symbol must be one of the symbols ignore, raise, or replace
Section 7.2. Opening Files
介绍如何打开文件。可以设置参数options, b-mode或者?transcoder。options的取值范围必须在(file-options)
枚举合集之内;b-mode指的是缓冲格式;?transcoder必须设置成一个有效的trancoder,或者设置成#f表示不适用transcoder。
语法形式 (file-options symbol ...)
可以获取打开文件的选项,默认选项情况下下(也就是不带任何symbol)会以输出方式打开一个文件,如果文件不存在的话会创建该文件。如果指定了no-fail选项,那么即便文件存在,也会将其打开,并将内容清空。如果制定了no-create选项,那么文件不存在的情况下不会自动创建文件。no-truncate只能搭配no-fail使用,即文件存在的时候依然打开文件,但不情况其内容。
默认选项可以看成是create, fail-if-exists,以及truncate的结合。no-create选项移除create;no-fail选项移除fail-if-exists;no-truncate选项移除truncate。
chez支持其他选项,比如是否压缩文件,是否排他访问,以及设置具体的文件访问权限。
相关语法:
(buffer-mode symbol)
,symbol必须是block, line以及none之一。(buffer-mode? obj)
相关执行诀:
(open-file-input-port path)
(open-file-input-port path options)
(open-file-input-port path options b-mode)
(open-file-input-port path options b-mode ?transcoder)
(open-file-output-port path options)
(open-file-output-port path options b-mode)
(open-file-output-port path options b-mode ?transcoder)
(open-file-input/output-port path)
(open-file-input/output-port path options)
(open-file-input/output-port path options b-mode)
(open-file-input/output-port path options b-mode ?transcoder)
Section 7.3. Standard Ports
进程的标准输入,输出以及错误输出。
文本port相关的执行诀:
(current-input-port)
(current-output-port)
(current-error-port)
二进制port相关的执行诀:
(standard-input-port)
(standard-output-port)
(standard-error-port)
Section 7.4. String and Bytevector Ports
本章的执行诀允许使用bytevector以及string作为输入输出流。
(open-bytevector-input-port bytevector)
(open-bytevector-input-port bytevector ?transcoder)
(open-string-input-port string)
(open-bytevector-output-port)
(open-bytevector-output-port ?transcoder)
(open-string-output-port)
(call-with-bytevector-output-port procedure)
(call-with-bytevector-output-port procedure ?transcoder)
(call-with-string-output-port procedure)
Section 7.5. Opening Custom Ports
(make-custom-binary-input-port id r! gp sp! close)
(make-custom-binary-output-port id w! gp sp! close)
(make-custom-binary-input/output-port id r! w! gp sp! close)
id
是一个字串用来给新开的port命名;r!
表示port支持输入;w!
表示port支持输出
;gp
跟获取port-position相关;sp!
跟set-port-position!相关;close
用来关掉port。
(make-custom-textual-input-port id r! gp sp! close)
(make-custom-textual-output-port id w! gp sp! close)
(make-custom-textual-input/output-port id r! w! gp sp! close)
Section 7.6. Port Operations
相关的执行诀:
(port? obj)
(input-port? obj)
(output-port? obj)
(binary-port? obj)
(textual-port? obj)
(close-port port)
(transcoded-port binary-port transcoder)
(port-transcoder port)
(port-position port)
(port-has-port-position? port)
(set-port-position! port pos)
(port-has-set-port-position!? port)
(call-with-port port procedure)
(output-port-buffer-mode port)
Section 7.7. Input Operations
相关的执行诀:
(eof-object? obj)
(eof-object)
(get-u8 binary-input-port)
(lookahead-u8 binary-input-port)
(get-bytevector-n binary-input-port n)
(get-bytevector-n! binary-input-port bytevector start n)
(get-bytevector-some binary-input-port)
(get-bytevector-all binary-input-port)
(get-char textual-input-port)
(lookahead-char textual-input-port)
(get-string-n textual-input-port n)
(get-string-n! textual-input-port string start n)
(get-string-all textual-input-port)
(get-line textual-input-port)
(get-datum textual-input-port)
(port-eof? input-port)
Section 7.8. Output Operations
(put-u8 binary-output-port octet)
(put-bytevector binary-output-port bytevector)
(put-bytevector binary-output-port bytevector start)
(put-bytevector binary-output-port bytevector start n)
(put-char textual-output-port char)
(put-string textual-output-port string)
(put-string textual-output-port string start)
(put-string textual-output-port string start n)
(put-datum textual-output-port obj)
(flush-output-port output-port)
Section 7.9. Convenience I/O
(open-input-file path)
(open-output-file path)
(call-with-input-file path procedure)
(call-with-output-file path procedure)
(with-input-from-file path thunk)
(with-output-to-file path thunk)
(read)
(read textual-input-port)
(read-char)
(read-char textual-input-port)
(peek-char)
(peek-char textual-input-port)
(write obj)
(write obj textual-output-port)
(display obj)
(display obj textual-output-port)
(write-char char)
(write-char char textual-output-port)
(newline)
(newline textual-output-port)
(close-input-port input-port)
(close-output-port output-port)
Section 7.10. Filesystem Operations
(file-exists? path)
(delete-file path)
Section 7.11. Bytevector/String Conversions
(bytevector->string bytevector transcoder)
(string->bytevector string transcoder)
(string->utf8 string)
(string->utf16 string)
(string->utf16 string endianness)
(string->utf32 string)
(string->utf32 string endianness)
(utf8->string bytevector)
(utf16->string bytevector endianness)
(utf16->string bytevector endianness endianness-mandatory?)
(utf32->string bytevector endianness)
(utf32->string bytevector endianness endianness-mandatory?)
(本篇完)