...
 
Commits (4)
    https://gitcode.net/OpenDocCN/sicp-js-zh/-/commit/7c2b55763956bdc9b427205a2a14b5b6748950bb 2023-03-30 17:20:31 2023-03-30T17:20:32+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/sicp-js-zh/-/commit/e283d5b58626aac505eeafdadb637b3e87c46ec2 2023-03-30 17:22:06 2023-03-30T17:22:06+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/sicp-js-zh/-/commit/2f83c6cbf03a2cdf361fe0fc9b95baf2061dc7f3 2023-03-31 11:20:30 2023-03-31T11:20:30+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/sicp-js-zh/-/commit/816d979000b23a9ce7e25046cecfb56e64d1ed5e 2023-03-31 11:29:14 2023-03-31T11:29:14+08:00 wizardforcel 562826179@qq.com
......@@ -12,7 +12,7 @@
理论上是这样的。在实践中,我们发现,当人类构造计算的描述时,画出有助于我们组织代码结构的区别是很方便的,这样我们可以更好地理解它们。我相信 Perlis 说的不是计算能力,而是人类的能力和人类的局限性。
人类思维似乎擅长的一件事是给事物命名;我们有强大的联想记忆。给定一个名字,我们可以很快回忆起一些相关的事情。这就是为什么我们通常发现使用 lambda 微积分比使用组合微积分更容易;对于大多数人来说,解释 Lisp 表达式`(lambda (x) (lambda (y) (+ x y)))`或 JavaScript 表达式要容易得多
人类思维似乎擅长的一件事是给事物命名;我们有强大的联想记忆。给定一个名字,我们可以很快回忆起一些相关的事情。这就是为什么我们通常发现使用 Lambda 演算比使用组合微积分更容易;对于大多数人来说,解释 Lisp 表达式`(lambda (x) (lambda (y) (+ x y)))`或 JavaScript 表达式要容易得多
`x => y => x + y`比组合式表达
......@@ -44,4 +44,4 @@ Lisp 和 JavaScript 有什么共同点?将计算(代码加上一些相关数
原语、组合方式、功能抽象、命名,以及通过区分以特定方式使用通用数据结构的约定:这些是优秀编程语言的基本构件。接下来,想象力和基于经验的良好工程判断可以完成剩下的工作。
——小盖伊·l·斯蒂尔,马萨诸塞州列克星敦,2021 年
\ No newline at end of file
——小盖伊·L·斯蒂尔,马萨诸塞州列克星敦,2021 年
\ No newline at end of file
......@@ -16,7 +16,7 @@
Lisp 是一个幸存者,已经使用了大约四分之一世纪。在活跃的编程语言中,只有 Fortran 有更长的寿命。这两种语言都支持重要应用领域的编程需求,Fortran 用于科学和工程计算,Lisp 用于人工智能。这两个领域仍然很重要,他们的程序员如此专注于这两种语言,以至于 Lisp 和 Fortran 很可能会继续活跃地使用至少四分之一世纪。
口齿不清的变化。本文中使用的 Scheme 方言是从最初的 Lisp 发展而来的,在几个重要方面与后者不同,包括变量绑定的静态范围和允许函数以值的形式产生函数。在语义结构上,Scheme 与 Algol 60 和早期的 Lisps 非常相似。Algol 60 永远不再是一种活跃的语言,它存在于 Scheme 和 Pascal 的基因中。除了这两种语言之外,很难找到另外两种语言是两种不同文化的沟通渠道。帕斯卡赞成建造金字塔——雄伟壮观、令人屏息的静态建筑,由军队将沉重的石块推到合适的位置。Lisp 是用来建造有机体的——壮观的、令人屏息的、动态的结构是由一组组将无数波动的简单有机体安装到位而建造的。这两种情况下使用的组织原则是相同的,除了一个非常重要的区别:委托给单个 Lisp 程序员的可自由导出的功能比 Pascal enterprises 中的功能多一个数量级。Lisp 程序用函数扩充了库,这些函数的效用超越了产生它们的应用程序。Lisp 的本地数据结构 list 在很大程度上是这种效用增长的原因。列表的简单结构和自然适用性反映在非常不同步的函数中。在 Pascal 中,过多的可声明数据结构导致了函数内的专门化,这抑制并惩罚了偶然的合作。在一个数据结构上运行 100 个函数比在 10 个数据结构上运行 10 个函数要好。因此,金字塔必须保持一千年不变;有机体必须进化或灭亡。
口齿不清的变化。本文中使用的 Scheme 方言是从最初的 Lisp 发展而来的,在几个重要方面与后者不同,包括变量绑定的静态范围和允许函数以值的形式产生函数。在语义结构上,Scheme 与 Algol 60 和早期的 Lisps 非常相似。Algol 60 永远不再是一种活跃的语言,它存在于 Scheme 和 Pascal 的基因中。除了这两种语言之外,很难找到另外两种语言是两种不同文化的沟通渠道。帕斯卡赞成建造金字塔——雄伟壮观、令人屏息的静态建筑,由军队将沉重的石块推到合适的位置。Lisp 是用来建造有机体的——壮观的、令人屏息的、动态的结构是由一组组将无数波动的简单有机体安装到位而建造的。这两种情况下使用的组织原则是相同的,除了一个非常重要的区别:委托给单个 Lisp 程序员的可自由导出的功能比 Pascal enterprises 中的功能多一个数量级。Lisp 程序用函数扩充了库,这些函数的效用超越了产生它们的应用程序。Lisp 的本地数据结构列表在很大程度上是这种效用增长的原因。列表的简单结构和自然适用性反映在非常不同步的函数中。在 Pascal 中,过多的可声明数据结构导致了函数内的专门化,这抑制并惩罚了偶然的合作。在一个数据结构上运行 100 个函数比在 10 个数据结构上运行 10 个函数要好。因此,金字塔必须保持一千年不变;有机体必须进化或灭亡。
为了说明这种差异,请将本书中对材料和练习的处理与任何使用 Pascal 的第一课教材中的处理进行比较。不要误以为这是一篇只有麻省理工学院才能理解的文章,是那里的学生所特有的。这正是一本关于 Lisp 编程的严肃书籍所必须具备的,不管学生是谁,也不管在哪里使用它。
......
......@@ -2,17 +2,17 @@
# 前言
《计算机程序的结构和解释》一书(SICP)通过建立一系列计算的心智模型向读者介绍了计算的核心思想。[第 1–3 章](c001.xhtml)涵盖了所有现代高级编程语言共有的编程概念。《SICP》最初的两个版本在他们的程序示例中使用了编程语言方案,其极简主义的、面向表达式的语法使这本书能够专注于潜在的思想,而不是所选语言的设计。第 4 章和 [5](c005.xhtml) 使用 Scheme 为 Scheme 制定语言处理器,加深读者对心智模型的理解,探索语言扩展和替代。
《计算机程序的结构和解释》一书(SICP)通过建立一系列计算的心智模型向读者介绍了计算的核心思想。第 1–3 章涵盖了所有现代高级编程语言共有的编程概念。《SICP》最初的两个版本在他们的程序示例中使用了编程语言方案,其极简主义的、面向表达式的语法使这本书能够专注于潜在的思想,而不是所选语言的设计。第 4 和 5 章使用 Scheme 为 Scheme 制定语言处理器,加深读者对心智模型的理解,探索语言扩展和替代。
自 1984 年出版和 1996 年再版以来,《SICP》已被世界各地的大学和学院采用为教科书,包括新加坡国立大学(NUS),它于 1997 年在 SICP 推出了入门课程 CS1101S。在 20 世纪 90 年代中期,出现了 Python、JavaScript 和 Ruby 语言,它们与 Scheme 共享中心设计元素,但是它们采用了更复杂的、面向语句的语法,该语法使用熟悉的代数(中缀)符号。这些程序越来越受欢迎,这使得教师们对他们在 SICP 的课程进行了调整,通常是将示例程序翻译成他们选择的语言,添加针对该语言的材料,以及省略第 4 章第 4 章第 11 章和第 5 章第 13 章的材料。
自 1984 年出版和 1996 年再版以来,《SICP》已被世界各地的大学和学院采用为教科书,包括新加坡国立大学(NUS),它于 1997 年在 SICP 推出了入门课程 CS1101S。在 20 世纪 90 年代中期,出现了 Python、JavaScript 和 Ruby 语言,它们与 Scheme 共享中心设计元素,但是它们采用了更复杂的、面向语句的语法,该语法使用熟悉的代数(中缀)符号。这些程序越来越受欢迎,这使得教师们对他们在 SICP 的课程进行了调整,通常是将示例程序翻译成他们选择的语言,添加针对该语言的材料,以及省略 4.4、4.11 和 5.13 节的材料。
##### 让 SICP 适应 JavaScript
将《SICP》第二版改编为 JavaScript (SICP JS)的工作始于 2008 年的新加坡国立大学,CS1101S 于 2012 年改用 JavaScript。语言标准 ECMAScript 2015 引入了 lambda 表达式、尾部递归以及块范围的变量和常量,这使得改编变得非常接近原始版本。只有当我们觉得 JavaScript 和 Scheme 之间的差异迫使我们对 SICP 进行实质性的修改时,我们才会这样做。这本书只涵盖了 JavaScript 的一小部分,所以读者不应该用它来学习语言。例如,JavaScript 对象的概念——无论如何都被认为是其基本成分之一——甚至没有被提及!
将《SICP》第二版改编为 JavaScript (SICP JS)的工作始于 2008 年的新加坡国立大学,CS1101S 于 2012 年改用 JavaScript。语言标准 ECMAScript 2015 引入了 Lambda 表达式、尾部递归以及块范围的变量和常量,这使得改编变得非常接近原始版本。只有当我们觉得 JavaScript 和 Scheme 之间的差异迫使我们对 SICP 进行实质性的修改时,我们才会这样做。这本书只涵盖了 JavaScript 的一小部分,所以读者不应该用它来学习语言。例如,JavaScript 对象的概念——无论如何都被认为是其基本成分之一——甚至没有被提及!
通过添加镜像 Scheme 原语的库——包括对列表结构的支持——并相应地修改文本,很容易将第 1 章到第 3 章的程序翻译成 JavaScript。然而,切换到 JavaScript 迫使我们对第 4 章和第 5 章的解释器和编译器做了微妙的改变,以处理返回语句。Scheme 的面向表达式的语法没有返回语句,这是面向语句语言的一个显著特征。
通过使用 JavaScript,[第 1–3 章](c001.xhtml)向读者介绍了当今大多数主流语言的语法风格。然而,同样的语法风格导致了第 4 章的重大变化,因为程序作为数据结构的直接表示不再是理所当然的了。这为我们提供了一个机会,向读者介绍 4.1 节中程序解析的概念,它是编程语言处理器的一个重要组成部分。在第 4.4 节中,JavaScript 的严格语法结构使所提出的逻辑编程系统的实现变得复杂,并且暴露了 JavaScript 作为编程语言设计工具的局限性。
通过使用 JavaScript,第 1–3 章向读者介绍了当今大多数主流语言的语法风格。然而,同样的语法风格导致了第 4 章的重大变化,因为程序作为数据结构的直接表示不再是理所当然的了。这为我们提供了一个机会,向读者介绍 4.1 节中程序解析的概念,它是编程语言处理器的一个重要组成部分。在第 4.4 节中,JavaScript 的严格语法结构使所提出的逻辑编程系统的实现变得复杂,并且暴露了 JavaScript 作为编程语言设计工具的局限性。
##### 使用 SICP JS 的资源
......@@ -20,6 +20,6 @@
##### 给读者
我们真诚地希望,如果这本书是你第一次接触编程,你将利用你新获得的对计算机程序的结构和解释的理解来学习更多的编程语言,包括 Scheme 和完整的 JavaScript 语言。如果你在学习 SICP JS 之前已经学习了 JavaScript,你可能会对这种语言背后的基本概念有新的见解,并发现用这么少的资源可以获得这么多的东西。如果你带着对《SICP》原著的了解来到《SICP JS 》,你可能会喜欢看到以新的形式呈现的熟悉的观点——并且可能会欣赏在线比较版,可以在该书的网页上找到,SICP JS 和 SICP 可以并排查看。
我们真诚地希望,如果这本书是你第一次接触编程,你将利用你新获得的对计算机程序的结构和解释的理解来学习更多的编程语言,包括 Scheme 和完整的 JavaScript 语言。如果你在学习 SICP JS 之前已经学习了 JavaScript,你可能会对这种语言背后的基本概念有新的见解,并发现用这么少的资源可以获得这么多的东西。如果你带着对《SICP》原著的了解来到《SICP JS》,你可能会喜欢看到以新的形式呈现的熟悉的观点——并且可能会欣赏在线比较版,可以在该书的网页上找到,SICP JS 和 SICP 可以并排查看。
—马丁·亨茨和托拜厄斯·里格斯塔德
\ No newline at end of file
......@@ -38,6 +38,6 @@
在教授我们的材料时,我们使用编程语言 Lisp 的一种方言。我们从不正式教授这门语言,因为我们不需要。我们就是用,过几天学生就拿起来了。这是类 Lisp 语言的一个很大的优势:它们很少有形成复合表达式的方法,而且几乎没有句法结构。所有的形式属性都可以在一个小时内完成,比如国际象棋的规则。过了一会儿,我们就忘记了语言的语法细节(因为根本没有),开始处理真正的问题——弄清楚我们想要计算什么,我们如何将问题分解成可管理的部分,以及我们将如何处理这些部分。Lisp 的另一个优点是,它比我们所知的任何其他语言都支持(但不强制)更多的程序模块化分解的大规模策略。我们可以进行过程和数据抽象,我们可以使用高阶函数来捕捉常见的使用模式,我们可以使用赋值和数据突变来模拟本地状态,我们可以用流和延迟评估来链接程序的各个部分,我们还可以轻松地实现嵌入式语言。所有这些都嵌入到一个交互式环境中,对增量程序设计、构建、测试和调试提供了出色的支持。我们感谢从约翰·麦卡锡开始的所有一代 Lisp 奇才,他们创造了一个前所未有的强大而优雅的工具。
Scheme 是我们使用的 Lisp 方言,它试图将 Lisp 和 Algol 的强大和优雅结合在一起。从 Lisp 中,我们获得了源自简单语法的元语言能力,程序作为数据对象的统一表示,以及垃圾收集堆分配的数据。从 Algol 中,我们得到了词法范围和块结构,这是 Algol 委员会中编程语言设计先驱们的礼物。我们希望引用约翰·雷诺兹和彼得·兰丁对 Church 的 lambda 演算与编程语言结构之间关系的见解。我们也认识到我们对数学家的亏欠,他们在计算机出现的几十年前就探索了这个领域。这些先驱包括阿隆佐·邱奇、巴克利·罗瑟、斯蒂芬·克莱尼和哈斯克尔·库里。
Scheme 是我们使用的 Lisp 方言,它试图将 Lisp 和 Algol 的强大和优雅结合在一起。从 Lisp 中,我们获得了源自简单语法的元语言能力,程序作为数据对象的统一表示,以及垃圾收集堆分配的数据。从 Algol 中,我们得到了词法范围和块结构,这是 Algol 委员会中编程语言设计先驱们的礼物。我们希望引用约翰·雷诺兹和彼得·兰丁对 Church 的 Lambda 演算与编程语言结构之间关系的见解。我们也认识到我们对数学家的亏欠,他们在计算机出现的几十年前就探索了这个领域。这些先驱包括阿隆佐·邱奇、巴克利·罗瑟、斯蒂芬·克莱尼和哈斯克尔·库里。
——哈罗德·艾贝尔森和杰拉德·让伊·萨斯曼
\ No newline at end of file
......@@ -10,7 +10,7 @@ SICP JS 和 CS1101S 的网络版很大程度上依赖于一个叫做源码学院
我们非常感谢瑞典研究和高等教育国际合作基金会 STINT,它的休假计划将马丁和托拜厄斯联系在一起,并允许托拜厄斯作为 CS1101S 的合作教师并加入 SICP JS 项目。
我们要感谢 Allen Wirfs-Brock 领导的 ECMAScript 2015 委员会的勇敢工作。SICP JS 严重依赖常量和 let 声明以及 lambda 表达式,所有这些都是通过 ECMAScript 2015 添加到 JavaScript 中的。这些增加的内容让我们在介绍 SICP 最重要的思想时贴近原著。领导第一个 ECMAScript 标准化的 Guy Lewis Steele Jr .对第 4 章的一些练习提供了详细而有用的反馈。
我们要感谢 Allen Wirfs-Brock 领导的 ECMAScript 2015 委员会的勇敢工作。SICP JS 严重依赖常量和`let`声明以及 Lambda 表达式,所有这些都是通过 ECMAScript 2015 添加到 JavaScript 中的。这些增加的内容让我们在介绍 SICP 最重要的思想时贴近原著。领导第一个 ECMAScript 标准化的 Guy Lewis Steele Jr .对第 4 章的一些练习提供了详细而有用的反馈。
—马丁·亨茨和托拜厄斯·里格斯塔德
......@@ -18,7 +18,7 @@ SICP JS 和 CS1101S 的网络版很大程度上依赖于一个叫做源码学院
我们要感谢帮助我们开发这本书和这一课程的许多人。
我们的主题显然是“6.231”的智力后代,这是一门关于编程语言学和 lambda 微积分的精彩课程,由 Jack Wozencraft 和 Arthur Evans Jr .于 20 世纪 60 年代在麻省理工学院教授。
我们的主题显然是“6.231”的智力后代,这是一门关于编程语言学和 Lambda 演算的精彩课程,由 Jack Wozencraft 和 Arthur Evans Jr. 于 20 世纪 60 年代在麻省理工学院教授。
我们非常感谢罗伯特·法诺,他重组了麻省理工学院的电子工程和计算机科学导论课程,以强调工程设计的原则。他带领我们开始了这项事业,并写了第一套主题笔记,这本书就是从这些笔记演变而来的。
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。