首先给出原著的链接: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》的朋友可以在此留言(内附一小段译文)的更多相关文章

  1. 一群牛人翻译:The Swift Programming Language 中文版

    无聊闲逛GIthub,看到一群牛人在github上创建了一个关于Switf的文档翻译项目 The Swift Programming Language 中文版 项目地址:中文版 Apple 官方 Sw ...

  2. The Swift Programming Language 中国版

    iSwifting社会的 Swift 兴趣交流群:303868520 iOS 微信公众账号:iOSDevTip Swift 微信公众账号:SwiftDev iSwifting社区 假设你认为这个项目不 ...

  3. 不忘初心 --- 重读<<The C Programming Language>>

    这篇文章应该发布在好几年前,2011年计算机界大师Dennis Ritchie仙逝,那时对大师的映象还停留在大一刚学编程时:Unix的合作开发者,C语言的发明人.通过网上的纪念文章<<Un ...

  4. 转:从《The C Programming Language》中学到的那些编程风格和设计思想

    这儿有一篇写的很好的读后感:http://www.cnblogs.com/xkfz007/articles/2566424.html   读书不是目的,关键在于思考.   很早就在水木上看到有人推荐& ...

  5. iOS Swift-元组tuples(The Swift Programming Language)

    iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...

  6. iOS Swift-控制流(The Swift Programming Language)

    iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...

  7. iOS Swift-简单值(The Swift Programming Language)

    iOS Swift-简单值(The Swift Programming Language) 常量的声明:let 在不指定类型的情况下声明的类型和所初始化的类型相同. //没有指定类型,但是初始化的值为 ...

  8. Java Programming Language Enhancements

    引用:Java Programming Language Enhancements Java Programming Language Enhancements Enhancements in Jav ...

  9. The Swift Programming Language 英文原版官方文档下载

    The Swift Programming Language 英文原版官方文档下载 今天Apple公司发布了新的编程语言Swift(雨燕)将逐步代替Objective-C语言,大家肯定想学习这个语言, ...

随机推荐

  1. LightSpeed使用指南

    LightSpeed 是一个最高性能的 .NET 领域建模和 O/R 映射框架,第一级别的 LINQ 支持.Visual Studio 2008/2010 设计器集成,是一个著名的高性能框架.[注:收 ...

  2. SQL Server 2008 R2——开发资料搜集

    ADO手册 http://download.csdn.net/detail/wlsgzl/8501115 =============================================== ...

  3. 问题解决——VS2010 将生成的文件复制到指定位置

    我是从VC6直接过渡到VS2010的,VS2008没怎么用过.用VS2010的时候,每次生成dll后,手工把dll.lib..h文件复制到指定文件夹太麻烦了,所以着手写了这个. =========== ...

  4. HashMap与TreeMap的区别

    首先描述下什么是Map. 在数组中我们是通过数组的下标来对其内容进行索引的,而在Map中我们是通过对象对对象进行索引的,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平常说的键值对. ...

  5. 烂泥:ubuntu中使用virt-manager图形化新建虚拟机

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上一篇文章介绍了,如何在ubuntu下安装KVM的虚拟机管理器virt-manager,这篇文章我们来介绍,如何在图形界面下使用virt-manager ...

  6. Android中解析XML

    XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...

  7. jsp页面img利用tomcat配置访问服务器绝对路径显示图片

    1.打开tomcat下的server.xml文件,路径\apache-tomcat-7.0.62\conf文件夹下. 2.下<host></host>加入<Context ...

  8. 001.linux下clock()检测程序运行时间

    #include <stdio.h> #include <time.h> int main() { int i; int k; clock_t start,end; //clo ...

  9. nyoj 203 三国志 dijkstra+01背包

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=203 思路:先求点0到每个点的最短距离,dijkstra算法,然后就是01背包了 我奇怪的 ...

  10. VMware + OpenStack: 从 Plugin 到 VIO (VMware Integrated OpenStack)的演进

    VMware 做为实际上的企业虚拟化领导者,对 OpenStack 的态度一直在变化.一开始,VMware 表达出与 OpenStack 的竞争态度.随着 OpenStack 的逐步壮大并且一步一步进 ...