V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xrlin
V2EX  ›  Go 编程语言

纪念一下我的第一个 scheme 解释器

  •  
  •   xrlin · 2019-01-16 19:26:31 +08:00 · 4275 次点击
    这是一个创建于 2129 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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,如果有好的实践还望不吝赐教。

    16 条回复    2019-01-17 16:49:16 +08:00
    sulinehk
        1
    sulinehk  
       2019-01-16 19:49:09 +08:00 via Android
    好东西啊
    sulinehk
        2
    sulinehk  
       2019-01-16 19:51:26 +08:00 via Android
    博客的 post 打不开了
    xrlin
        3
    xrlin  
    OP
       2019-01-16 19:56:17 +08:00
    @sulinehk #2 博客可以访问啊,难道遇到浏览器兼容问题
    rrfeng
        4
    rrfeng  
       2019-01-16 20:29:55 +08:00 via Android
    厉害
    但是那个交互提示光标(输入行)上下闪好难受
    Wincer
        5
    Wincer  
       2019-01-16 20:37:05 +08:00 via Android
    厉害👍,我 sicp 看了两章,第三章就看不下去了😟
    sulinehk
        6
    sulinehk  
       2019-01-16 23:31:13 +08:00 via Android
    @xrlin 又可以用了 可能是我信号不太好吧
    jdhao
        7
    jdhao  
       2019-01-17 00:19:26 +08:00
    赞~
    qinfensky
        8
    qinfensky  
       2019-01-17 00:27:46 +08:00
    强悍啊
    zwh2698
        9
    zwh2698  
       2019-01-17 06:35:34 +08:00 via Android
    Lz 暴露年龄了吧,mit 似乎已经改成 python 了,这个世界还有多少学习这个
    catsoul
        10
    catsoul  
       2019-01-17 08:33:33 +08:00
    @zwh2698 可能只是买了旧版的书,而且其实内容差不多,lz 也是用 GOLANG 实现的,所以无所谓啦~
    mozartgho
        11
    mozartgho  
       2019-01-17 08:39:15 +08:00
    MIT 现在已经不用了 SICP 了,最新教材是《如何设计程序》使用 Racket 语言。新教材网上有免费版在线版本:
    https://htdp.org/2018-01-06/Book/index.html
    azuki
        12
    azuki  
       2019-01-17 08:45:14 +08:00 via Android
    @zwh2698

    python 版的是 cmu 的。

    我记得之前看到消息说 mit 不教 sicp 了。
    pythonee
        13
    pythonee  
       2019-01-17 09:12:44 +08:00
    这么强悍啊,赞一个楼主
    no1xsyzy
        14
    no1xsyzy  
       2019-01-17 11:09:35 +08:00
    @zwh2698 SICP 就只是个路过的神作,并不仅限于写代码,而是上升到哲学层面了。
    一说 Lisp 之所以受到如此高的评价(最好的语言是什么? Lisp 一出话题其实就结束了)很大程度上是因为 SICP 将 Lisp 提升到另一境界的缘故。
    单就 “编程” 这件事来说,Python 就是个弟弟。
    xrlin
        15
    xrlin  
    OP
       2019-01-17 12:43:14 +08:00
    @zwh2698 #9 python 版本也看过一点,当时好像还没有整理好的 python 版本,只是一个课程的教案,后来没继续跟着网络课程学,虽然不同语言的差别确实挺大,比如在类型方面,scheme 需要使用 tagged-list,python、go 之类的则可以直接将基础类型聚合作为新的类型,但是此外的思路大致都是一样的。
    eshezhao
        16
    eshezhao  
       2019-01-17 16:49:16 +08:00
    厉害 群主找工作吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1500 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:18 · PVG 01:18 · LAX 09:18 · JFK 12:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.