LispEx - 让 Lisp 支持并发编程

2014-07-23 17:23:40 +08:00
 kedebug
LispEx 是用 Go 语言编写的一款符合 R5RS 标准的 Lisp 解释器。

有意思的地方是,在设计之初我就考虑是否能为其添加一些并发编程的语言特性,让这门古老的编程语言充满生机起来。

于是便选择了 Go 语言来实现它,耗时近 2 个月,Go 里面的一些特性如:goroutine, channel, select 等语义都在 LispEx 中有了支持。

开源地址: https://github.com/kedebug/LispEx

- 遵守 KISS 原则,尽量把代码设计的简单,易懂。很多模块被很好的分离出来,想添加新的语义支持的话,只需要添加、修改个别文件的源代码。

- 借鉴了王垠大神 Yin 语言的代码设计思路:任何一个 Node 都会被解释成 Value;Parser 被拆分成了 2 个阶段:包括预处理生成语法单元,然后 Parse 成语法树。顺着这个思路,代码会变得非常易读,当然在设计的时候针对这点是费了很多心思的,希望对一些后人能有借鉴意义。

- 并发的词法分析器。这点 Rob Pike 在 http://cuddle.googlecode.com/hg/talk/lex.html#title-slide 提到过。LispEx 把它实践了一遍。

- Go liked 并发语义支持。下面一段代码演示了并发编程里面经典的 ping-pong 案例,并且借助 channel 实现了信号量:
https://gist.github.com/kedebug/284f5f30aec01f8b96af
再来一段 select 语义示例:
https://gist.github.com/kedebug/eddfc8a9e981c6f67c8d
更多精彩代码演示请见: https://github.com/kedebug/LispEx
5603 次点击
所在节点    分享创造
21 条回复
kedebug
2014-07-25 11:38:46 +08:00
@qinix 非常不错的想法。
在 LispEx 的基础上,我想是很容易扩展的,你可以定义如下类似原语:

(import "fmt")
(fmt/println "hello world")

但是还有个问题:Go 语言是不支持动态调用 package 的:

http://stackoverflow.com/questions/8076034/how-to-import-package-by-path-from-string-in-go

所以在实现的过程中,要稍微费点周折,比如自己在 fmt 外围封装一层变成自己的 fmt.go 然后加以引用。具体感兴趣可以自己尝试下。

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

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

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

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

© 2021 V2EX