从看 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,如果有好的实践还望不吝赐教。
1
sulinehk 2019-01-16 19:49:09 +08:00 via Android
好东西啊
|
2
sulinehk 2019-01-16 19:51:26 +08:00 via Android
博客的 post 打不开了
|
4
rrfeng 2019-01-16 20:29:55 +08:00 via Android
厉害
但是那个交互提示光标(输入行)上下闪好难受 |
5
Wincer 2019-01-16 20:37:05 +08:00 via Android
厉害👍,我 sicp 看了两章,第三章就看不下去了😟
|
7
jdhao 2019-01-17 00:19:26 +08:00
赞~
|
8
qinfensky 2019-01-17 00:27:46 +08:00
强悍啊
|
9
zwh2698 2019-01-17 06:35:34 +08:00 via Android
Lz 暴露年龄了吧,mit 似乎已经改成 python 了,这个世界还有多少学习这个
|
11
mozartgho 2019-01-17 08:39:15 +08:00
MIT 现在已经不用了 SICP 了,最新教材是《如何设计程序》使用 Racket 语言。新教材网上有免费版在线版本:
https://htdp.org/2018-01-06/Book/index.html |
13
pythonee 2019-01-17 09:12:44 +08:00
这么强悍啊,赞一个楼主
|
14
no1xsyzy 2019-01-17 11:09:35 +08:00
@zwh2698 SICP 就只是个路过的神作,并不仅限于写代码,而是上升到哲学层面了。
一说 Lisp 之所以受到如此高的评价(最好的语言是什么? Lisp 一出话题其实就结束了)很大程度上是因为 SICP 将 Lisp 提升到另一境界的缘故。 单就 “编程” 这件事来说,Python 就是个弟弟。 |
15
xrlin OP @zwh2698 #9 python 版本也看过一点,当时好像还没有整理好的 python 版本,只是一个课程的教案,后来没继续跟着网络课程学,虽然不同语言的差别确实挺大,比如在类型方面,scheme 需要使用 tagged-list,python、go 之类的则可以直接将基础类型聚合作为新的类型,但是此外的思路大致都是一样的。
|
16
eshezhao 2019-01-17 16:49:16 +08:00
厉害 群主找工作吗
|