从看 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,如果有好的实践还望不吝赐教。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.