简易网页 racket/scheme/lisp 解释器

2017-04-15 12:27:02 +08:00
 yangyuan
主要是照着 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 设计就可以。但是地址操作要做很大限制。
2683 次点击
所在节点    分享创造
5 条回复
Mistwave
2017-04-15 20:06:46 +08:00
Racket 在国内确实小众,支持一下
yivanus
2017-04-18 22:17:08 +08:00
刚好玩过 racket ,但实际用起来好像没啥方向。
yangyuan
2017-04-19 02:07:06 +08:00
@yivanus 在研究领域这类语言用的比较多。
exch4nge
2017-04-21 13:05:51 +08:00
@yangyuan LZ 啥时候计划支持 macro ,比如 define-syntax 之类的……
yangyuan
2017-04-23 01:35:28 +08:00
@exch4nge 暂时不打算支持,因为现在是打算支持到 racket 中等学生语言。

define-syntax 需要完全更改架构,代码会变得晦涩,就像官方 racket 一样。
代码量也会变得很大,网页载入会变慢。

如果我想支持 define-syntax ,我会直接写个 scheme 版本的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/355045

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX