Lisp 书籍推荐之 Lisp from Nothing

这是一本2020年出版的书,知名度貌似不怎么高,以至于我今天凌晨刷Reddit才发现有这么一本书,教你设计一门 self-interpreting 的 minimal Lisp-1 方言,用 Scheme 写把它编译成 C 的编译器,之后用这门方言写它自己的编译器,实现 bootstrapping,中间穿插着许多远古时期计算机有关的各种轶闻hack故事,全书除去附录才200多页,风格较为幽默,我觉得对计算机历史或 Lisp 感兴趣的同学都值得读一下,前置知识可以参考 McCarthy 的Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I 或者 Paul Graham 的 The Root of Lisp,关于讲解 Lisp 内部实现的还有更详细全面的 Anatomy of Lisp 和 Lisp in Small Pieces 值得一读。

15 个赞

刚才把作者给的源码扒下来玩了一下,发现我的 Chez Scheme 报错了,在作者的主页逛了一圈才发现写编译器用的是 R4RS 标准的 Scheme(还是 CL 安逸,标准30年没动过),而书里居然一个字都没提到过这个问题,之后我谷歌搜的排列第一的 R4RS 解释器 S9fES(没错就是作者本人写的,他还写了一本书教你怎么写一个 Scheme 解释器),试了试终于成功跑起来了,打算自己用 CL 重写一下,看来作者已经默认看他此书的都是熟悉他系列书的老古董。

2 个赞

看到代码不分大小写就该注意到不是现代 Scheme 了

1 个赞

书里的所有 Lisp 代码包括 CL 都是大写的,主打一个复古风

看了下,Chez 编译不过的原因就是 R6RS 默认大小写敏感(R5RS 前不敏感), 在 liscmp.scm 开头加上一行

(case-sensitive #f)

在 Makefile 里写

SCM=	scheme -q

就能用 Chez Scheme 编译出来了


怎么发现的?把代码一行行喂给 liscmp.scm,发现出错在

(SETQ TERPRI
  (LAMBDA ()
    (*WRITEC *NL)))

对着编译输出读代码,发现 exprcom(eq? '*writec (car x)) 的条件根本没执行到,大胆推测是 case sensitivity 问题,手动输入小写的 (*writec 1) 发现能生成正确的代码,确定 liscmp.scm 是用 read 读取代码后,加上 (case-sensitive #f) 编译一试就成功了。

5 个赞

Get it,我还以为他用了什么和 R6RS 不兼容的旧特性,原来仅仅是大小写敏感

1 个赞

@LdBeth @Raime 咳咳,诸君,你们有人买了吗,我可以蹭着看看吗?

我没买,因为其实历史方向的内容我差不多知道是啥了,至于编译器实现方面兴趣不是很大

说来惭愧,我直接搜的电子版看的,不知道在这个论坛发盗版是否违规。

偷偷的进村,打枪的不要