今日好书丨《The Little Schemer:递归与函数式的奥妙》
Posted 博文视点Broadview
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了今日好书丨《The Little Schemer:递归与函数式的奥妙》相关的知识,希望对你有一定的参考价值。
《The Little Schemer:递归与函数式的奥妙》
Lisp程序员津津乐道的一大奇书
全球无数人的编程之路由此起步
【美】Daniel P. Friedman,
Matthias Felleisen 著
卢俊祥 译
2017年7月出版
小编推荐:本书将计算作为小学和高中算术与代数知识的扩展。以递归函数的方式介绍编程,简要讨论计算机所能发挥的作用。作者通过独特的编程语言、有趣的各式食物来描述这些抽象概念。
下方评论区留下对此书的想法,选取一名幸运同学将赠此书,8月4日公布获奖用户。
本书是一本久负盛名的经典之作,两位作者Daniel P. Friedman、Matthias Felleisen在程序语言界名声显赫。本书介绍了Scheme的基本结构及其应用、Scheme的五法十诫、Continuation-Passing-Style、Partial Function、Y-Combinator、Interpreter等内容,并通过这些内容阐述了计算的一般本质。本书没有什么理论性描述,所有概念都蕴含在独特的引导式一问一答过程中,这种方式让读者对程序大师运用熟稔的程序方法来驾驭概念的能力叹为观止。
通过阅读本书,可以让读者领略递归的奥妙、函数式编程风格的魅力。阅读完毕会有一种意犹未尽的感觉。
本书适合所有程序员阅读,特别是函数式编程爱好者。好好享用!
Daniel P. Friedman & Matthias Felleisen
Daniel P. Friedman是美国印第安那大学计算机科学系的教授。Matthias Felleisen是美国莱斯大学计算机科学系的教授。同时,他们使用Scheme来教授计算及编程课程的经验超过了25年,发表了100多篇论文,出版了3部Scheme相关书籍。
程序接受数据并产生数据。程序设计需要彻底理解数据;好的程序会反映出所处理数据的结构。大多数的数据集合,并由此延伸到大多数程序,都是可递归表示的。递归是依据自身定义对象或解决问题的方法。
本书的目标是引导读者学习递归思维模式。我们首先需要确定与递归概念搭档的语言。这里有三种相对明确的选择:自然语言,如英语;形式化的数学语言;或者是编程语言。自然语言易产生歧义、不严谨且有时候拖沓冗长。这可能在人们日常交流时没什么问题,但对于简明阐述递归这样的严谨概念,这些特征就容易出问题。数学语言则与自然语言相反:其仅通过一些符号就能表述强大的形式化概念。但很不幸,除非接受过数学专业训练,否则一般人理解不了数学语言。技术与数学的结合带给了我们第三种选择—几乎是最理想的选择:编程语言。我们相信编程语言是表达递归概念的最佳方式。编程语言像数学那样,具备将形式化含义赋予一系列符号的能力。但又不同于数学,可以直接体验编程语言—可以运行本书中的程序,观察其行为,然后修改它,再看看修改效果。
Scheme大概是用来讲解递归概念的最佳编程语言。符号化是Scheme的天然特质—程序员不必过多考虑所用语言符号与计算机表述形式之间的关联。递归是Scheme的天然计算机制;主要的Scheme编程任务是创建(可能的)递归定义。Scheme程序主要用于交互—程序员可以立即运行代码并观察结果。此外,至本书结束时,我们收获的最大感悟应该是:Scheme程序结构与程序所操纵数据之间是直接对应的 。
虽然Scheme程序可以以一种非常形式化的方式来描述,但理解Scheme并不需要特别的数学知识。实际上,本书基于一个Scheme两周“速成”介绍课程的讲义整理而成,该课程针对那些没有编程经验且不喜欢数学的学生。这些学生中有许多人正准备从事公共事务方面的工作。我们的信条是:用Scheme递归地编写程序本质上是简单的模式识别(Pattern Recognition)。由于我们唯一关心的是递归编程,因此我们仅在Scheme的几个招式上下功夫:car、cdr、cons、eq?、null?、zero?、add1、sub1、number?、and、or、quote、lambda、define以及cond。事实上,我们选择了完美的Scheme编程语言—我们的程序才能如此简洁。
The Little Schemer和The Seasoned Schemer并未涉足应用编程领域,但掌握书中的概念则为你打开了理解计算本质的大门。
读者指南
阅读本书切勿走马观花、一味图快。请仔细阅读,金玉珠玑分散在书中各个角落。本书很重要,重要的书至少读三遍。阅读时做到一步一个脚印。在未完全理解一章之前,不要尝试跳到下一章。问题按难度递增排序;解决不了早先的问题,后面的问题则将更难回答。
本书以对话方式组织内容,涉及Scheme程序的样例趣谈时,对话将在你(读者)和我们(作者)之间进行。请尽可能动手试验阅读到的样例代码。获取Scheme是一件很容易的事。尽管在不同Scheme实现之间存在微小语法差异(主要是特殊名称和特定函数方面的拼写),但Scheme语法基本上是一致的。接下来要玩转Scheme,还得定义本书引入的atom?、sub1和add1:
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
试一试(atom? (quote ())),看看其是否返回#f,以验证Scheme正确定义了atom?。实际上,该概念同样适用于诸如Common Lisp这样的现代Lisp方言。在Lisp中要以函数方式定义atom?:
(defun atom? (x)
(not (listp x)))
此外,你可能还需要对书中的程序进行稍加修改。典型的,只是做个别变化。框格注释 会给出程序试验的建议。“S:”打头的注释代表Scheme相关内容,“L:”打头的注释代表Common Lisp相关内容。
第4章我们会通过3个运算函数:add1、sub1和zero?来开发一个基本的算术程序。由于Scheme并未提供add1和sub1,因此需要借助内建的加减基本元件来定义它们。进一步的,为了避免冲突,程序的加减法必须以不同的符号:+和—来分别实现 。
本书不涉及任何形式化定义。我们相信你可以构建自己的定义,并因而记住及理解这些定义,这样的效果比我们一口口喂给你吃要好。但在你出山之前,需确保自己彻底理解了Scheme的五法十诫 。学习Scheme的钥匙是“模式识别”。Scheme十诫心法指出了具体模式。在本书的早期,一些概念出于简单起见讲解得比较浅显;但随着内容的深入,将适时展开描述。你应该也知道,虽然全书讲的是Scheme,但Scheme自身应用的广泛性,可不是我们用介绍性文字就能够清晰阐述的。在掌握了本书内容之后,就可以着手阅读与理解更加全面且高级的其他Scheme书籍了。
我们的大量示例都跟食物有关,这里有两个原因。首先,食物比抽象符号更形象(你如果正在节食,显然不适合读这本书,开玩笑)。我们希望各种食物能够帮助你理解示例及相关概念。其次,我们打算乱一下你的心智。我们知道学习之路总是充满各种沮丧,一点点障碍将有助你保持清醒。
你可以整装待发了。祝你好运!希望你好好享受荆棘旅程中的激情挑战。
祝你胃口大开!
丹尼尔•弗里德曼
马提亚•费雷森
第1章 玩具总动员 2
第2章 处理,处理,反复处理…… 14
第3章 用cons构筑恢宏 32
第4章 数字游戏 58
第5章 我的天!都是星星 80
第6章 如影随形 96
第7章 朋友及关系 110
第8章 Lambda终结者 124
第9章 ……周而复始…… 148
第10章 值是什么 174
幕间休息 192
索引 194
博文视点
您阅读的专业智库
了解更多本书详情请点击阅读原文
长按二维码轻松关注
点击阅读原文,即可快速抵达本书详情页!
以上是关于今日好书丨《The Little Schemer:递归与函数式的奥妙》的主要内容,如果未能解决你的问题,请参考以下文章