Author: ctian Date: Tue Aug 28 10:33:26 2007 New Revision: 26
Modified: books/onlisp/0-preface.tex books/onlisp/1-the_extensible_language.tex Log: Take suggest from Huang Jianshi
Modified: books/onlisp/0-preface.tex ============================================================================== --- books/onlisp/0-preface.tex (original) +++ books/onlisp/0-preface.tex Tue Aug 28 10:33:26 2007 @@ -17,26 +17,26 @@ experienced Lisp programmers build the language up toward their programs.''}.
-本书教授如何使用自底向上的编程风格, 因为这是 Lisp 最擅长的方式. +本书教授如何使用自下而上的编程风格, 因为这是 Lisp 最擅长的方式.
-\section*{自底向上的设计} +\section*{自下而上的设计} \label{sec:bottom-up_design}
-随着软件复杂度的增长, 自底向上设计的重要性也正在日益提高. 今天的程序可能不得不面对极其复杂甚至开放式的需求. +随着软件复杂度的增长, 自下而上设计的重要性也正在日益提高. 今天的程序可能不得不面对极其复杂甚至开放式的需求. 在这种情况下,传统的自顶向下方法有时会失效. 一种新的编程风格由此诞生, 它和当前大部分计算机科学课程的思路截然不同: -一个自底向上的程序由一系列的层写成, 每一层都作为更上一层的编程语言. X Window 和 \TeX +一个自下而上的程序由一系列的层写成, 每一层都作为更上一层的编程语言. X Window 和 \TeX 就是这种程序设计风格的范例.
-本书的主题是双重的: 就是说 Lisp 对于以自底向上的风格编写程序来说是一种自然的语言, -同时自底向上的风格也是编写 Lisp 程序的一种自然的方式. \textsl{论 Lisp} 因此将吸引两类读者. +本书的主题是双重的: 就是说 Lisp 对于以自下而上的风格编写程序来说是一种自然的语言, +同时自下而上的风格也是编写 Lisp 程序的一种自然的方式. \textsl{论 Lisp} 因此将吸引两类读者. 对于那些有兴趣编写可扩展程序的人, 本书将告诉你如果有了正确的语言你能做什么. 对于 Lisp 程序员来说, 本书提供一套关于怎样使用 Lisp 才能发挥其最大优势的实践性说明.
本书的标题是为了强调自底向下编程对于 Lisp 的重要性. 相比只是用 Lisp 编写你的程序, 你还可以 \textsl{用 Lisp} 写你自己的语言, 然后再用来写你的程序.
-理论上用任何语言都可以写出的自底向上风格的程序, 但 Lisp 对于这种编程风格来说是最自然的载体. 在 Lisp 里, -自底向上设计不是一种专用于少见的大型或困难的程序的特别技术. 任何程度的程序都可以部分地用这种方式编写. +理论上用任何语言都可以写出的自下而上风格的程序, 但 Lisp 对于这种编程风格来说是最自然的载体. 在 Lisp 里, +自下而上设计不是一种专用于少见的大型或困难的程序的特别技术. 任何程度的程序都可以部分地用这种方式编写. Lisp 从一开始就是种可扩展的语言. 这种语言本身基本上就是一个 Lisp 函数的集合, 这些函数和你自己定义的没有本质区别. 更进一步的是, Lisp 函数可以表达成列表, 这也是 Lisp 的数据结构. 这就意味着你可以写能生成 Lisp 代码的 Lisp 函数.
@@ -106,7 +106,7 @@ 关键在于, 这些程序并不短, 因为它们依赖于编程技巧, 只是由于它们恰好用 Lisp 写成. 第 23 和 24 章的关键之处不是如何用一页代码实现 ATN 解析器或者用两页实现 Prolog, 而是想说明这些程序, 当给出它们最自然的 Lisp 实现的时候是如此的简短. 后面这两个章节的嵌入式语言用实例证明了我开始时的观点: -Lisp 对于以自底向上的风格编写程序来说是一种自然的语言, 同时自底向上的风格也是编写 Lisp 程序的一种自然的方式. +Lisp 对于以自下而上的风格编写程序来说是一种自然的语言, 同时自下而上的风格也是编写 Lisp 程序的一种自然的方式.
本书以一个关于面向对象编程的讨论结束, 尤其是 \textsc{CLOS}, Common Lisp 对象系统. 通过将这一主题留到最后, 我们可以更加清楚地看到, 面向对象的编程方式是一种 Lisp 已经展示过的扩展思想. 它也是可以 \textsl{在 Lisp 上}
Modified: books/onlisp/1-the_extensible_language.tex ============================================================================== --- books/onlisp/1-the_extensible_language.tex (original) +++ books/onlisp/1-the_extensible_language.tex Tue Aug 28 10:33:26 2007 @@ -56,7 +56,7 @@ 你可能会对语言和应用程序之间的衔接过于敏感以至于你再能够回到另一种语言, 那种你感觉并不能给你很多你所需要的灵活性的语言.
-\section{自底向上编程} +\section{自下而上编程} \label{sec:programming_bottom-up}
一个长期存在的编程原则是作为程序的功能性单元不应该过于庞大. 如果程序里某些组件的规模增长超过了它可读的程度, @@ -70,14 +70,14 @@ 但也足够小到可以作为一个基本单元来理解.
有经验的 Lisp 程序员用另一种不同的方式来细化他们的程序. 类似自顶向下的设计那样, 他们根据一种称为 -\textsl{自底向上的设计} 原则来处理---通过改变语言来适应程序. 在 Lisp 中, 你不仅是根据语言向下写程序, +\textsl{自下而上的设计} 原则来处理---通过改变语言来适应程序. 在 Lisp 中, 你不仅是根据语言向下写程序, 也可以根据程序向上构造语言. 在你编程的时候你可能会想 ``我希望 Lisp 这样或者那样的操作符.'' 于是你就可以直接去实现它. 后来你意识到使用新的操作符可以简化程序中另一部分的设计, 诸如此类. 语言和程序一同演变. 就像交战两国的边界一样, 语言和程序的界限不断地变化, 直到最终它们稳定在山川和河流的边缘, 这也就是你要解决的问题本身的自然边界. 最后你的程序看起来就好像语言就是为解决它而设计的. 并且当语言和程序都非常适应彼此时, 你得到的将是清晰, 短小和高效的代码.
-值得强调的是, 自底向上的设计并不意味着只是以不同的顺序写同一个程序. 当你以自底向上的方式工作时, +值得强调的是, 自下而上的设计并不意味着只是以不同的顺序写同一个程序. 当你以自下而上的方式工作时, 你通常得到的是一个完全不同的程序. 你将得到一个带有更多抽象操作符的更大的语言, 和一个用它写的更小的程序, 而不是一个简单的整块的程序. 你将得到一个拱而不是梁.
@@ -86,22 +86,22 @@
\begin{enumerate} \item - 通过让语言做更多的工作, 自底向上设计产生的程序更加短小轻快. 一个更短小的程序就不必划分成许多的组件, + 通过让语言做更多的工作, 自下而上设计产生的程序更加短小轻快. 一个更短小的程序就不必划分成许多的组件, 并且更少的组件意味着程序更易于阅读和修改. 更少的组件也意味着更少的组件之间的连接, 这样也会减少错误发生的机会. 一个工业设计者往往努力地减少一台机器上运动部件的数量, 同样有经验的 Lisp - 程序员使用自底向上的设计方法来减少他们程序的规模和复杂度. + 程序员使用自下而上的设计方法来减少他们程序的规模和复杂度. \item - 自底向上的设计促进了代码重用. 当你写两个或更多程序时, 许多你为第一个程序所写的工具也对后面的程序也有用. + 自下而上的设计促进了代码重用. 当你写两个或更多程序时, 许多你为第一个程序所写的工具也对后面的程序也有用. 一旦你攒下来雄厚的工具基础, 写一个新程序所花的成本相比从裸 Lisp 环境开始可能只有几分之一. \item - 自底向上的设计提高了程序的可读性. 一个这种类型的抽象要求读者去理解一个通用操作符, + 自下而上的设计提高了程序的可读性. 一个这种类型的抽象要求读者去理解一个通用操作符, 而一个具体的函数抽象则要求读者去理解一个专用的子例程. \item - 由于自底向上的设计导致你总是去关注代码中的模式, 这种工作方式有助于澄清设计程序时的思路. + 由于自下而上的设计导致你总是去关注代码中的模式, 这种工作方式有助于澄清设计程序时的思路. 如果一个程序中两个相距遥远的组件在形式上很相似, 你可能就会注意到这种相似性然后可能会以更简单的方式重新设计程序. \end{enumerate}
-自底向上的设计对于其他非 Lisp 语言来说也能达到一定程度. 当你看到库函数的时候, 那就是自底向上设计的结果. +自下而上的设计对于其他非 Lisp 语言来说也能达到一定程度. 当你看到库函数的时候, 那就是自下而上设计的结果. 尽管如此, Lisp 带给你该领域更广阔的力量, 在 Lisp 风格程序中语言这一角色重要性也成比例地增加了--- 因此 Lisp 不仅是另一种不同的语言, 更是一整套完全不同的编程方式.
@@ -118,7 +118,7 @@ 到他们的所有需求. 但如果我们不能给他们一个能做到他们想要的每一件事的软件, 我们可以给他们一个可扩展的软件. 我们把自己的软件从仅是一个程序转化成一个编程语言, 然后高级用户就可以在此基础上构建他们需要的额外特性.
-自底向上的设计很自然地产生了可扩展的程序. 最简单的自底向上程序包括两层: 语言和程序. 复杂程序可以被写成一系列层, +自下而上的设计很自然地产生了可扩展的程序. 最简单的自下而上程序包括两层: 语言和程序. 复杂程序可以被写成一系列层, 每一层作为其上层的编程语言. 如果这一哲学被一直用到最上面的那层, 那这层对于用户来说就变成了一门编程语言. 这样一个可扩展性渗透到每一层次的程序, 相比那些先按照传统黑箱方法写成, 然后又想得到可扩展性的那些系统来说, 可以成为一个好得多的编程语言. @@ -195,7 +195,7 @@ (例如算术或者 I/O) 继续被使用, 你只需要实现改变了的部分 (例如控制结构). 以这种方式实现的语言称为 \textsl{嵌入式语言}.
-嵌入式语言是自底向上程序设计的自然产物. Common Lisp 里已经包括几种. 其中最著名的, \textsc{CLOS}, +嵌入式语言是自下而上程序设计的自然产物. Common Lisp 里已经包括几种. 其中最著名的, \textsc{CLOS}, 将在最后一章里讨论. 但你也可以定义自己的嵌入式语言. 你可以得到一个完全符合你程序需要的语言, 甚至它们最后看起来跟 Lisp 已经非常不同.
cl-net-snmp-cvs@common-lisp.net