Golang Go语言 纪念一下我的第一个 scheme 解释器
Golang Go语言 纪念一下我的第一个 scheme 解释器
GoScheme
Github: https://github.com/xrlin/goscheme
从看 SICP 起就想写一个解释器,然而现在 SICP 都没看完。。。。看第四章后就有点迷糊了,似懂非懂,所以马上实践一下,程序使用 Golang 编写,相比书中的实现方式可能不太优雅,scheme 这语言真的可以开拓思维。
安装
go get github.com/xrlin/goscheme/cmd/goscheme
如果不想自己编译可以在这里下载最新版本的可执行文件。
使用
# 执行 goscheme 命令 /你自己下载的可执行文件进入 REPL 终端模式 goscheme
命令后可以指定执行某个 scheme 文件
goscheme test.scm
简单的例子
-
计算第 N 个斐波那契数
; calculate nth fibonacci number (define (fib n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2)))))
(fib 10)
;#=> 55
; calculate nth fibnacci number in tail recursion (define (fib2 n) (begin (define (fib-iter a b n) (if (= n 0) b (fib-iter b (+ a b) (- n 1)))) (fib-iter 0 1 (- n 1)))) (fib2 30) ;#=>832040
-
相互递归
(letrec ( (zero? (lambda (x) (= x 0))) (even? (lambda (n) (if (zero? n) #t (odd? (- n 1))))) (odd? (lambda (n) (if (zero? n) #f (even? (- n 1)))))) (even? 88)) ;#=>#t
项目里的example.scm
包含了一些简单的 scheme 程序。
支持的特性
-
可交互性的 REPL shell
-
尾递归优化
-
惰性求值
-
短路逻辑运算
-
基本类型:
String
,Number
,Quote
,LambdaProcess
,Pair
,Bool
... -
支持的语法、内置的方法
load
define
let
let*
letrec
begin
lambda
and
or
not
if
cond
delay
map
reduce
force
+
-
*
/
=
cons
list
append
list-length
list-ref
quote
null?
'
eval
apply
set!
set-cdr!
set-car!
... etc
因为当时还没想好代码结构,是一边写一边重构的,测试不太充分,如果发现 bug 可以给我提个 issue,如果有好的实践还望不吝赐教。
更多关于Golang Go语言 纪念一下我的第一个 scheme 解释器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
博客的 post 打不开了
#2 博客可以访问啊,难道遇到浏览器兼容问题
厉害
但是那个交互提示光标(输入行)上下闪好难受
厉害👍,我 sicp 看了两章,第三章就看不下去了😟
又可以用了 可能是我信号不太好吧
赞~
强悍啊
Lz 暴露年龄了吧,mit 似乎已经改成 python 了,这个世界还有多少学习这个
可能只是买了旧版的书,而且其实内容差不多,lz 也是用 GOLANG 实现的,所以无所谓啦~
MIT 现在已经不用了 SICP 了,最新教材是《如何设计程序》使用 Racket 语言。新教材网上有免费版在线版本:
https://htdp.org/2018-01-06/Book/index.html
python 版的是 cmu 的。
我记得之前看到消息说 mit 不教 sicp 了。
这么强悍啊,赞一个楼主
SICP 就只是个路过的神作,并不仅限于写代码,而是上升到哲学层面了。
一说 Lisp 之所以受到如此高的评价(最好的语言是什么? Lisp 一出话题其实就结束了)很大程度上是因为 SICP 将 Lisp 提升到另一境界的缘故。
单就 “编程” 这件事来说,Python 就是个弟弟。
#9 python 版本也看过一点,当时好像还没有整理好的 python 版本,只是一个课程的教案,后来没继续跟着网络课程学,虽然不同语言的差别确实挺大,比如在类型方面,scheme 需要使用 tagged-list,python、go 之类的则可以直接将基础类型聚合作为新的类型,但是此外的思路大致都是一样的。
厉害 群主找工作吗
恭喜你完成了第一个Scheme解释器的开发!这是一个非常重要的里程碑,标志着你在Go语言编程方面取得了显著的进步。
Scheme是一种强大的、函数式编程语言,其解释器的实现涉及对编程语言核心概念的深入理解,包括词法分析、语法分析、语义分析以及执行模型等。通过实现一个Scheme解释器,你不仅掌握了Go语言的基本语法和编程技巧,还深入了解了编译原理和解释器的工作原理。
在开发过程中,你可能遇到了许多挑战,比如如何处理复杂的语法结构、如何优化解释器的性能、如何调试和测试解释器等。这些经历无疑让你更加熟悉Go语言的特性和编程范式,也提升了你的问题解决能力和编程思维。
未来,你可以继续优化和完善你的Scheme解释器,比如添加更多的内置函数和语法特性、提高解释器的执行效率和稳定性等。同时,你也可以尝试实现其他类型的解释器或编译器,以进一步拓展你的编程技能和知识领域。
总之,完成第一个Scheme解释器是一个值得纪念的时刻,它标志着你在编程道路上的又一次成长和进步。希望你能够继续保持对编程的热情和好奇心,不断探索和学习新的技术和知识。祝你在未来的编程旅程中取得更多的成就和突破!