Author: ctian Date: Wed Aug 29 07:39:10 2007 New Revision: 29
Modified: books/onlisp/0-preface.tex books/onlisp/onlisp.tex Log: Merge fix from Jianshi Huang, thanks.
Modified: books/onlisp/0-preface.tex ============================================================================== --- books/onlisp/0-preface.tex (original) +++ books/onlisp/0-preface.tex Wed Aug 29 07:39:10 2007 @@ -4,31 +4,30 @@ 本书适用于那些想成为更好的 Lisp 程序员的人. 本书假设读者已经熟悉 Lisp, 但不要求已有广泛的编程经验. 最初几章里会包含一些知识回顾. 我希望这些章节也令有经验的 Lisp 程序员感兴趣, 因为它们以新的视角展示了熟知的主题.
-通常很难用一句话来表达一门编程语言的本质, 但 John Foderato 这句已经很接近了: +通常很难用一句话来表达一门编程语言的本质, 但 John Foderato 的这句描述已经很到位了:
\begin{quote} - Lisp 是一门可编程的编程语言. + Lisp 是一门可编程的编程语言. (Lisp is a programmable programming language.) \end{quote}
-当然 Lisp 的特性绝不至这些, 但这种随心所欲使用 Lisp 的能力, 在很大程度上正是 Lisp 专家和新手的区别之处. -其他程序员根据语言向下写程序, 而资深 Lisp 程序员用程序向上构造语言\footnote{译者注: - 翻译可能不太准确, 原文是 +当然 Lisp 的特性绝不止这些, 但这种随心所欲使用 Lisp 的能力, 在很大程度上正是 Lisp 专家和新手的区别之处. +和其他程序员自上而下写程序不同, 资深 Lisp 程序员从语言自下而上构建他们的程序\footnote{译者注: 原文是 ``As well as writing their programs down toward the language, experienced Lisp programmers build the language up toward their programs.''}.
本书教授如何使用自下而上的编程风格, 因为这是 Lisp 最擅长的方式.
-\section*{自下而上的设计} +\section*{自下而上的设计 (Bottom-up Design)} \label{sec:bottom-up_design}
随着软件复杂度的增长, 自下而上设计的重要性也正在日益提高. 今天的程序可能不得不面对极其复杂甚至开放式的需求. -在这种情况下,传统的自顶向下方法有时会失效. 一种新的编程风格由此诞生, 它和当前大部分计算机科学课程的思路截然不同: +在这种情况下,传统的自上而下方法有时会失效. 一种新的编程风格由此诞生, 它和当前大部分计算机科学课程的思路截然不同: 一个自下而上的程序由一系列的层写成, 每一层都作为更上一层的编程语言. X Window 和 \TeX 就是这种程序设计风格的范例.
-本书的主题是双重的: 就是说 Lisp 对于以自下而上的风格编写程序来说是一种自然的语言, -同时自下而上的风格也是编写 Lisp 程序的一种自然的方式. \textsl{论 Lisp} 因此将吸引两类读者. +本书的主题是双重的: 就是说 Lisp 对于以自下而上的编程风格来说是一种自然的语言, +同时自下而上的编程风格也是编写 Lisp 程序的一种自然的方式. \textsl{On Lisp} 因此将吸引两类读者. 对于那些有兴趣编写可扩展程序的人, 本书将告诉你如果有了正确的语言你能做什么. 对于 Lisp 程序员来说, 本书提供一套关于怎样使用 Lisp 才能发挥其最大优势的实践性说明.
@@ -37,23 +36,24 @@
理论上用任何语言都可以写出的自下而上风格的程序, 但 Lisp 对于这种编程风格来说是最自然的载体. 在 Lisp 里, 自下而上设计不是一种专用于少见的大型或困难的程序的特别技术. 任何程度的程序都可以部分地用这种方式编写. -Lisp 从一开始就是种可扩展的语言. 这种语言本身基本上就是一个 Lisp 函数的集合, 这些函数和你自己定义的没有本质区别. +Lisp 从一开始就是种可扩展的语言. 语言本身基本上就是一个 Lisp 函数的集合, 这些函数和你自己定义的没有本质区别. 更进一步的是, Lisp 函数可以表达成列表, 这也是 Lisp 的数据结构. 这就意味着你可以写能生成 Lisp 代码的 Lisp 函数.
-一个好的 Lisp 程序员必须懂得如何利用上述这种可能性的优势. 通常做到这点的方式是定义一种称为 \textsl{宏} +一个好的 Lisp 程序员必须懂得如何利用上述的这种可能性. 通常的途径是定义一种称为 \textsl{宏} 的操作符. 驾驭宏是从编写正确的 Lisp 程序到编写漂亮的程序过程中最重要的一步. 入门级 Lisp -书籍给宏留下的篇幅仅限于一个宏的简短的概述: 一个关于宏是什么的解释, 连带少许暗示你能用这种奇妙的东西做什么的示例. +书籍给宏留下的篇幅仅限于一个宏的简短的概述: 一个关于宏是什么的解释, 连带少许示例暗示你能用它实现一些奇妙的东西. 不过在本书里这些奇妙的东西将得到特别的重视. -本书的一个目标就是将所有那些人们至今都很难学到的使用宏的经验收集到一处. +本书的一个目标就是收集所有那些人们至今都很难学到的使用宏的经验.
一般入门级 Lisp 书籍都不太强调 Lisp 和其他语言的区别, 当然这是可以理解的. -它们不得不从那些大都被学校教导成只会用 Pascal 术语来思考程序的学生中获得信息. -如果仔细解释这些区别的话只会加重混乱程度: 例如说 \texttt{defun} 虽然看起来像一个过程定义, -但实际上是一个程序在写另一个程序然后生成一段代码生成了一个函数对象然后用函数定义时给出的第一个参数来索引它. - -本书的一个目的就是解释究竟什么使 Lisp 不同于其他语言. 当我刚开始的时候, 我知道, 当所有其他条件都相等时, -我更倾向于用 Lisp 而不是 C 或 Pascal 或 Fortran 来写程序. 我也知道这不只是感觉的问题. -但我意识到如果我真的准备要解释 Lisp 在某些场合下是更好的语言, 我就最好得准备解释下为什么了. +它们不得不把信息传递给那些被调教成只会用 Pascal 术语来思考编程的学生们. +如果非要仔细解释这些区别的话, 只会加重混乱程度: 例如 \texttt{defun} 虽然看起来像一个过程定义, +但实际上是一个程序在写另一个程序然后生成一段代码: +生成了一个函数对象然后用函数定义时给出的第一个参数作为它的索引. + +本书的一个目的就是解释究竟什么使 Lisp 不同于其他语言. 当我刚开始学 Lisp 的时候, 当所有其他条件都相等时, +我知道我更倾向于用 Lisp 而不是 C 或 Pascal 或 Fortran 来写程序. 我也知道这不只是个人品位的问题. +但我真的决定要解释 Lisp 在某些方面是更好的语言的时候, 我就得好好准备一下了.
当某些人问 Louis Armstrong 什么是爵士乐时, 他回答说 ``如果你问爵士乐是什么, 那你永远不会知道.'' 但他确实以一种方式回答了这个问题: 他向人们 \textsl{展示} 了什么是爵士乐. 同样也只有一种方式来解释 Lisp @@ -61,60 +61,60 @@ 采用的都是那些你可以用任何语言编写的程序. \textsl{On Lisp} 处理的是那类你只能用 Lisp 来写的程序. 可扩展性, 自顶向下编程, 交互式开发, 源代码转换, 嵌入式语言---这些都是 Lisp 展示其高级特性的场合.
-当然, 从理论上讲, 任何图灵等价的编程语言都可以做到任何其他同类语言相同的事. 但那种程度的能力不是编程语言所关心的. -理论上任何你能用编程语言做到的事也可以用图灵机来说, 但实际上在一个图灵机上编程得不偿失. +当然, 从理论上讲, 任何图灵等价的编程语言都可以做到任何其他同类语言能做的事. 但那个所谓的能力不是指编程语言的能力. +理论上任何你能用编程语言做到的事也可以用图灵机来做, 但实际上在图灵机上编程得不偿失.
所以当我说这本书是关于讲如何做那些其他语言不可能做到事情的时候, 我并非指数学意义上的 ``不可能'', 而是在事实上从编程语言角度去看的. 这就是说, 如果你不得不用 C 来写本书中的一些程序, 你可能需要先用 C -写一个 Lisp 编译器. 举个例子, C 语言中的嵌入式 Prolog---你能想象这需要多少工作量吗? +写一个 Lisp 编译器. 举个例子, C 语言中的嵌入 Prolog---你能想象这需要多少工作量吗? 第 24 章将说明如何用 180 行 Lisp 做到这点.
-我希望做到比简单地演示 Lisp 的威力更多的事, 尽管如此, 我也想解释 \textsl{为何} Lisp 与众不同. -这将出现一个本质问题---过于本质而不得不使用诸如 ``符号计算'' 这样的术语来回答. -我将尽我所能地试图尽可能清晰地解释这些问题. +我希望能比单单演示 Lisp 的强大做得更多一些, 尽管如此, 我也想解释 \textsl{为何} Lisp 与众不同. +这是一个更本质的问题---难以解释而不得不使用诸如 ``符号计算'' 这样的术语来回答. +我将尽可能清晰地解释这些问题.
\section*{本书计划} \label{sec:plan_of_the_book}
由于函数是 Lisp 编程的基础, 本书以一些有关函数的章节开始. -第 2 章解释 Lisp 函数究竟是什么以及他们所提供的可能性. -第 3 章然后讨论函数型编程的优点, 这是 Lisp 程序最突出的风格. +第 2 章解释 Lisp 函数究竟是什么以及他们所提供的编程方式的可能性. +然后第 3 章然后讨论函数型编程的优点, 这是 Lisp 程序最主要的风格. 第 4 章展示如何用函数来扩展 Lisp. -第 5 章建议了一种新类型的抽象让我们可以定义那些返回其他函数的函数. +第 5 章建议了一种新的抽象方式, 返回其他函数的函数. 最后, 第 6 章显示了怎样使用函数来代替传统的数据结构.
-相比函数, 本书更加关注宏. 宏得到更多的关注部分是因为宏本身就有更多内容, -部分是因为它们至今还没有适当的书面描述. 第 7--10 章形成一个宏技术的完整指导. -结束的时候你将了解一个有经验的 Lisp 程序员所知的关于宏的大多数内容: 它们如何工作; 怎样定义, 测试, 以及调试它们; -什么时候使用以及不使用宏; 宏的主要类型; 怎样写生成宏展开代码的程序; 宏风格一般如何区别于 Lisp 风格; -以及怎样检测和修复每一种影响宏的唯一性问题. +本书剩下的篇幅则更加关注宏. 因为宏本身就有更多内容, +部分是因为它们至今还没有适当的出版物. 第 7--10 章形成一个完整的宏的指导教程. +完成后你将了解一个有经验的 Lisp 程序员所知的关于宏的大多数内容: 它们如何工作; 怎样定义, 测试, 以及调试它们; +何时应该使用以及何时不应该使用宏; 宏的主要类型; 怎样写生成宏展开代码的程序; 宏风格一般如何区别于 Lisp 风格; +以及怎样检测和修复每一种影响宏的独特的问题.
-紧跟着这些指导, 第 11--18 章展示了一些可以用宏构造出来的强有力的抽象. 第 11 章展示如何写经典宏--- -那些创造上下文, 或者实现循环或条件判断的宏. 第 12 章解释宏在生成变量操作中的角色. 第 13 +随后, 第 11--18 章展示了一些可以用宏来构造的强有力的抽象. 第 11 章展示如何写经典的宏--- +那些创造上下文, 或者实现循环或条件判断的宏. 第 12 章解释宏在操作普通变量中的角色. 第 13 章展示宏如何通过将计算转移到编译期来使程序运行得更快. 第 14 章介绍了 anaphoric(首语重复) 宏, 可以允许你在程序里使用代词. 第 15 章展示了宏如何为第 5 章里定义的函数生成器提供一个更便利的接口. -第 16 章展示了如何使用可以定义宏的宏来让 Lisp 为你写程序. 第 17 章讨论读取宏, 以及第 18 章, 解构宏. +第 16 章展示了如何使用定义宏的宏来让 Lisp 为你写程序. 第 17 章讨论读取宏, 以及第 18 章, 解构宏.
第 19 章开始了本书的第四部分, 转向嵌入式语言. 第 19 章通过展示同一个程序, 一个回答数据库查询的程序, -先是用解释器, 然后用真正的嵌入式语言, 来介绍这一主题.第 20 章展示了如何将 continuation 概念引入 -Common Lisp 程序, 这是一种描述针对计算的提示的那种对象. Continuation 是一个强有力的工具, +先是用解释器, 然后用真正的嵌入式语言, 来介绍这一主题.第 20 章展示了如何将续延 (continuation) 概念引入 +Common Lisp 程序, 这是一种描述延续性计算的对象. 续延是一个强有力的工具, 可以用来实现多处理和非确定性选择. 将这些控制结构嵌入到 Lisp 中的讨论分别在第 21 和 22 章. 非确定性允许你写出有先见之明的程序, 听起来就像一种不寻常力量的抽象. 第 23 和 24 章展示了两种嵌入式语言, -让非确定性达到其存在的意义: 总共 200 行代码的一个完整的 ATN 解析器, 以及一个嵌入式 Prolog. +展示非确定性的存在意义: 一个完整的 ATN 解析器, 以及一个嵌入式 Prolog, 总共才 200 行代码.
-这些程序相对短小的事实对它们本身来说并无意义. 如果你诉诸于编写无法理解的代码, 无人能告诉你 200 行代码能做干什么. -关键在于, 这些程序并不短, 因为它们依赖于编程技巧, 只是由于它们恰好用 Lisp 写成. 第 23 和 24 +这些程序的长短对它们本身来说并无意义. 如果你诉诸于编写无法理解的代码, 无人能告诉你 200 行代码能做干什么. +关键在于, 这些程序并不是因为依赖于编程技巧才变得短小, 而是由于它们是以 Lisp 固有的, 自然的方式写成. 第 23 和 24 章的关键之处不是如何用一页代码实现 ATN 解析器或者用两页实现 Prolog, 而是想说明这些程序, -当给出它们最自然的 Lisp 实现的时候是如此的简短. 后面这两个章节的嵌入式语言用实例证明了我开始时的观点: -Lisp 对于以自下而上的风格编写程序来说是一种自然的语言, 同时自下而上的风格也是编写 Lisp 程序的一种自然的方式. +当给出它们最自然的 Lisp 实现的时候是如此的简短. 后面这两个章节的嵌入式语言用实例证明了我开始时的双重观点: +Lisp 对于以自下而上的编程风格来说是一种自然的语言, 同时自下而上的编程风格也是编写 Lisp 程序的一种自然的方式.
-本书以一个关于面向对象编程的讨论结束, 尤其是 \textsc{CLOS}, Common Lisp 对象系统. 通过将这一主题留到最后, -我们可以更加清楚地看到, 面向对象的编程方式是一种 Lisp 已经展示过的扩展思想. 它也是可以 \textsl{在 Lisp 上} -构造出来的多种抽象之一. - -一个章节的有价值的注释开始于第 \pageref{chap:notes} 页. 这些注释里包括参考文献, 附加或者替换的代码, -或者是 Lisp 方面跟内容无关的一些描述. 注释是用页面边界外的小圆圈标注出来的, 就像这样\footnote{ - 目前还做不出来, 不会...}. 另外还有一个关于包 (packages) 的附录, 在第 \pageref{chap:packages} 页. +本书以关于面向对象编程的讨论结束, 特别讨论了 \textsc{CLOS}, Common Lisp 对象系统. 通过将这一主题留到最后, +我们可以更加清楚地看到, 面向对象的编程方式是一种已经存在于 Lisp 的思想的扩展. 它是多种可以建立 +\textsl{在 Lisp 上} 的抽象之一. + +自成一章的注释开始于第 \pageref{chap:notes} 页. 这些注释里包括参考文献, 附加或者替换的代码, +或者是有关 Lisp 的但跟主题无关的一些描述. 注释是用页面边界外的小圆圈标注出来的, 就像这样 +\footnote{目前还做不出来, 不会...}. 另外还有一个关于包 (packages) 的附录, 在第 \pageref{chap:packages} 页.
正如一次纽约的观光旅游可能是一次世界上大多数文化的观光那样, 一次对 Lisp 作为可扩展编程语言的学习也能勾画出大部分 Lisp 技术. 这里描述的大多数技术通常都被 Lisp 社区所了解, @@ -132,10 +132,12 @@ 本书包含几百个示例, 范围从简单的表达式到可运行的 Prolog 实现. 本书中任何位置的代码, 都被写成可以在任何版本的 Common Lisp 上运行\footnote{译者注: 翻译版中的将重新确保所有代码都可以在当前的 Common Lisp 标准下运行, 并且在 SBCL, LispWorks 等主要平台下测试, 所有这些代码修改也会通过脚注明确标示出来.}. -那些极少数需要用到不在 \textsc{CLTL1} 规范中实现的特性的示例将会被明显地在文本中标记出来. +那些极少数需要用到的 \textsc{CLTL1} 规范之外的特性的示例将会被明确地在文本中标记出来. +最后几个章节里包括一些 Scheme 的示例代码, 这些也会被清楚的标示出来.
所有代码可以通过匿名 \textsc{FTP} 从 \texttt{endor.harvard.edu} 下载, 在 \texttt{pub/onlisp} -目录里. 问题和评论可以发到 \texttt{onlisp@das.harvard.edu}. +目录里. 问题和评论可以发到 \texttt{onlisp@das.harvard.edu}. 中文用户可以发到水木社区 BBS +(\texttt{bbs.newsmth.net}) 的 \texttt{FuncProgram} 板.
\section*{致谢} \label{sec:acknowledgements}
Modified: books/onlisp/onlisp.tex ============================================================================== --- books/onlisp/onlisp.tex (original) +++ books/onlisp/onlisp.tex Wed Aug 29 07:39:10 2007 @@ -11,9 +11,16 @@ \newcommand{\sq}{\texttt{#'}}
\begin{titlepage} -\title{On Lisp\footnote{原书地址: \texttt{http://www.paulgraham.com/onlisp.html%7D%7D%7D -\author{Paul Graham 著 - \and Chun Tian (binghe) 译\footnote{\texttt{E-mail: binghe.lisp@gmail.com}}} +\title{On Lisp\thanks{原书网站: \texttt{http://www.paulgraham.com/onlisp.html%7D%7D%7D +\author{Paul Graham [著] + \and Chun Tian (binghe) [译] + \thanks{E-mail: \texttt{binghe.lisp@gmail.com}}\ + NetEase.com, Inc.\ + 杭州研究院 + \and Jianshi Huang [校] + \thanks{E-mail: \texttt{jianshi.huang@gmail.com}}\ + 電気通信大学 システム工学\ + 本多研究室} \end{titlepage}
\maketitle
cl-net-snmp-cvs@common-lisp.net