这是一本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 值得一读。
16 个赞
刚才把作者给的源码扒下来玩了一下,发现我的 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 个赞
我没买,因为其实历史方向的内容我差不多知道是啥了,至于编译器实现方面兴趣不是很大
说来惭愧,我直接搜的电子版看的,不知道在这个论坛发盗版是否违规。
偷偷的进村,打枪的不要