Golang Go语言 纪念一下我的第一个 scheme 解释器

发布于 1周前 作者 eggper 来自 Go语言

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

17 回复

好东西啊

更多关于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解释器是一个值得纪念的时刻,它标志着你在编程道路上的又一次成长和进步。希望你能够继续保持对编程的热情和好奇心,不断探索和学习新的技术和知识。祝你在未来的编程旅程中取得更多的成就和突破!

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!