六月初的时候,接触了伯克利的一门神课 CS 61A,名为 “Structure and Interpretation of Computer Programs”,可以看作是是大名鼎鼎的教材 SICP 的 Python 版本。当时天天复习机器学习和算法,对着一大堆理论和公式啃, 正好听说这门课的 lab 和 project 都很“短小精悍”,甚是有趣,且有简单易用的自动化测评脚本,十分方便,于是抱着调节一下学习内容的想法打开了这门课的主页,从此一发不可收拾。
这门课大半部分是 Python,虽然写 Python 已经一年半了,它还是常常能给我一种“Python 竟然还能这样玩”的惊喜;后面的部分还包括一点点 Scheme 和 SQL,其中 Scheme 这一部分更是让我大受震撼,于是在今天用一天看完了这部分四节课、做完了四个小作业、还有一个用 Python 实现 Scheme 解释器的 project,感觉整个人都升华了,于是决定写一篇文章记录一下。
Scheme 是“上古语言” Lisp 的 “方言” 之一(因为没有标准化,所以 Lisp 有很多种不同版本的实现,Scheme 是其中比较有名的一种),是一门函数式编程语言。刚接触就给了我一种很不一样的感觉,和之前学过的 C、Python 完全不一样的路数。
首先 Scheme 完全采用前缀表达式的写法,每个表达式都需要用括号括起来,这就导致,写起来很难受。
有个著名的 Lisp 笑话,大意是苏联军队截获了美军的一个重要代码文件的最后一页,一看发现全是右括号。之前不太理解,今天学了之后终于能理解了。
一个简单的幂运算的例子,还好给 vscode 配上了美化括号的插件,不然就得一边写代码一边数括号了。
具体 Scheme 的语法就不再多说了,它的精妙之处包括但不限于以下几点:
-
函数式编程,引用透明,没有副作用;
-
code is data,也就是说可以通过代码来操作代码,或者编写编写程序的程序(无限套娃)。
-
……
很难说清楚这是一种什么样的感觉,大概只有亲身学一下才能体会到这种奇妙。
当然,区区几个小时,我只能算是掌握了一点点语法,甚至来点复杂的嵌套宏我就绕晕了。但我还是深刻感受到了 Scheme 的优雅以及有趣,如果有时间强烈推荐大家尝试一下。
这门课的第四个 Project 就是用 Python 来实现一个简单的 Scheme 解释器,其有两种版本,标准版和困难版。敢于挑战(不自量力)的我当然选择了困难版。可以看一下项目说明中的描述:
This is an alternate "extreme" version of the standard Scheme project that gives you much less guidance than the normal version. Taditionally, students without substantial prior programming experience have found this version of the project very difficult.
行,硬着头皮上吧。然而,做了快两个小时,做完了第一问,一看分数,第一问 2 分,一共 30 分。嗯,看来今晚做不完了…再做第二问,虽然有思路,但光读懂相关代码就要花费大量时间,且总是不能考虑全面,或是想到了不知怎样优雅地实现。于是乎,坦然接受自己还是水平太低的事实,放弃困难版,转向标准版。
标准版就友好多了,基本上把核心代码框架都给出来了,不需要自己再去设计、要自己考虑的条件也少了很多,只需要读懂相关代码并在一些关键位置写几行就可以了。事实上,“读懂相关代码”同样难度不小,这个项目读代码的时间可比 debug 的时间长多了。
大概从下午五点开始做,做到十二点,除去中间吃饭休息,六个多小时。其中花费在困难版三个小时,标准版三个小时(当然标准版的前面部分,直接把自己做完的困难版代码搬过来就可以了),总算是把“解释器”的部分做完了。
打算明天再花几个小时,把剩下的几题收尾了,再把整个项目通读一遍。接近两千行的项目,还是相当有学习价值的。
当然,以后大概率不会再学 Scheme 了,也就是这段时间心血来潮,做了这样一个尝试。毕竟再优雅的语言,也得能当饭碗才能成为好语言。不过,把它当作一个玩具,有空时把玩一下,虽然学不太深,但切换一下不同的编程视角,还是挺有趣的一件事情。
发表评论