需要中文版《The Scheme Programming Language》的朋友可以在此留言(内附一小段译文)
首先给出原著的链接: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)、
通用端口操作、输入操作、输出操作、
方便的输入输出、文件系统操作、字节向量和字符串的相互转换。
需要中文版《The Scheme Programming Language》的朋友可以在此留言(内附一小段译文)的更多相关文章
- 一群牛人翻译:The Swift Programming Language 中文版
无聊闲逛GIthub,看到一群牛人在github上创建了一个关于Switf的文档翻译项目 The Swift Programming Language 中文版 项目地址:中文版 Apple 官方 Sw ...
- The Swift Programming Language 中国版
iSwifting社会的 Swift 兴趣交流群:303868520 iOS 微信公众账号:iOSDevTip Swift 微信公众账号:SwiftDev iSwifting社区 假设你认为这个项目不 ...
- 不忘初心 --- 重读<<The C Programming Language>>
这篇文章应该发布在好几年前,2011年计算机界大师Dennis Ritchie仙逝,那时对大师的映象还停留在大一刚学编程时:Unix的合作开发者,C语言的发明人.通过网上的纪念文章<<Un ...
- 转:从《The C Programming Language》中学到的那些编程风格和设计思想
这儿有一篇写的很好的读后感:http://www.cnblogs.com/xkfz007/articles/2566424.html 读书不是目的,关键在于思考. 很早就在水木上看到有人推荐& ...
- iOS Swift-元组tuples(The Swift Programming Language)
iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...
- iOS Swift-控制流(The Swift Programming Language)
iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...
- iOS Swift-简单值(The Swift Programming Language)
iOS Swift-简单值(The Swift Programming Language) 常量的声明:let 在不指定类型的情况下声明的类型和所初始化的类型相同. //没有指定类型,但是初始化的值为 ...
- Java Programming Language Enhancements
引用:Java Programming Language Enhancements Java Programming Language Enhancements Enhancements in Jav ...
- The Swift Programming Language 英文原版官方文档下载
The Swift Programming Language 英文原版官方文档下载 今天Apple公司发布了新的编程语言Swift(雨燕)将逐步代替Objective-C语言,大家肯定想学习这个语言, ...
随机推荐
- Effective Java 08 Obey the general contract when overriding equals
When it's the case that each instance of the class is equal to only itself. 1. Each instance of the ...
- SQL2014内存表性能之内存中 OLTP 的性能改进测试
先贴1个例子,后续补充完整的测试例子.... 1.用MSDN例子测试一下 use master go --1.先创建包含内存优化文件组的数据库 CREATE DATABASE imoltp2 ON P ...
- SQL 统计表行数和空间大小
CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR() , rowsinfo BIGINT , reserved VARCHAR() , datainfo ...
- cxf构建webservice的两种方式
一.简介 对于基于soap传输协议的webservice有两种开发模式,代码优先和契约优先的模式.代码优先的模式是通过编写服务器端的代码,使用代码生成wsdl:契约优先模式首先编写wsdl,再通过ws ...
- shell的查找与替换
shell中做查找,grep是注定逃不开的. cat file | grep austin 就是在文档中查找Austin所在行. grep和正则表达式匹配之后,查找功能变得异常强大. 这个时候,要保证 ...
- hibernate一对一关系实现
按照主键映射,按照外键映射 Address.hbm.xml: <?xml version="1.0"?><!DOCTYPE hibernate-mapping P ...
- Linux内核阅读相关
一.likely()与unlikely()函数的意义 http://blog.chinaunix.net/uid-27665626-id-3506567.html 二.TSO.UFO.GSO.LRO. ...
- Linux / OS X 实用命令
具体可用参数还是用man指令查方便一点,在此不一一列出 图片来自imooc 磁盘相关: df 查看硬盘分区情况,实例 df -h du 查看文件大小情况 du -s /Directory 用户/用户组 ...
- Hive variable demo
create table ori_trans (account string, maker string, tdate string) partitioned by (country string); ...
- 怎样对ZBrush中的材料进行渲染和着色
ZBrush可以实时的进行不断的渲染和着色. 对于绘制操作,ZBrush®增加了新的范围尺度,可以让你给基于像素的作品增加深度,材质,光照和复杂精密的渲染特效,真正实现了 2D 与 3D 的结合,模糊 ...