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... -
支持的语法、内置的方法
loaddefineletlet*letrecbeginlambdaandornotifconddelaymapreduceforce+-*/=conslistappendlist-lengthlist-refquotenull?'evalapplyset!set-cdr!set-car!... etc
因为当时还没想好代码结构,是一边写一边重构的,测试不太充分,如果发现 bug 可以给我提个 issue,如果有好的实践还望不吝赐教。