主要是照着 racket 做的,但国内没多少人听说过 racket ,所以标上了 scheme/lisp 。
Racket 是一个 scheme 系的语言。
源码用 TypeScript 编写,实现了一个面向对象的 AST 实现。理论上可以无伤翻译为 Java/C#/C++/Python 之类。
语法树上所有节点都是 expression , expression 的 value 要么是 binary data 要么是 procedure 。
理论上支持一个新语法,最差情况就是新建一种 expression 。
*商业 [解*释*器] 是不会用这种架构,这么做的目的是为了用最少最易懂的代码(但是牺牲性能)完成一个精简的解释器主体。
相反这个架构参考了大量 scheme 编译器的文章和源码。
此外没有自己做 call frame 而是直接递归,同样是为了代码更好懂。
既然是玩具暂时不想着做 properly tail recursion 。(要啥自行车。。
DEMO:
https://yangyuan.github.io/racket.js/
源码
https://github.com/yangyuan/racket.js/
Racket 语法样例
https://github.com/yangyuan/racket.js/blob/master/docs/examples.md
抽时间写的, base 语法实现了大部分。
主要缺内置 list 、 string 、数学函数。
计划用林散时间补齐,然后加上 bigbang 和少量图像函数。
--------------------------------------------------------------------
最近在想能不能用类似的方式实现 C 的解释。
之前有 Clang 经验,似乎理论上照它的 AST 设计就可以。但是地址操作要做很大限制。