分享一个五一假期写的 lisp 解释器

2016-05-02 23:28:33 +08:00
 luohaha

用 c 语言实现的 lisp 解释器,基本实现了 lisp 的特性。功能比较简单,代码主要分成三个部分:

  1. 词法分析。将输入的文件流转化成单词数组。
  2. 语法分析。根据单词数组,生成 AST 。
  3. 执行部分。这里参考了 SICP 中的第四章中, eval 和 apply 的讲解。

用它写出来的代码如下, 实现了 Fibonacci 函数:

;;第一种递归求 fibonacci 的方法
(define fib-1
    (lambda (n)
        (cond ((= n 0) 0)
              ((= n 1) 1)
              (else (+ (fib-1 (- n 1))
                       (fib-1 (- n 2)))))))
 
;;第二种, 尾递归
(define fib-iter
    (lambda (a b count)
        (if (= count 0)
            b
            (fib-iter (+ a b) a (- count 1)))))
(define fib-2
    (lambda (n)
        (fib-iter 1 0 n)))
 
 
(fib-2 100)

项目代码在 https://github.com/luohaha/Dior 。欢迎交流,求 star 。

3133 次点击
所在节点    分享创造
10 条回复
a302800411
2016-05-03 09:43:48 +08:00
赞~
luohaha
2016-05-03 14:09:25 +08:00
@a302800411 多谢!
petelin
2016-05-03 22:18:34 +08:00
Mark
yurivvvvv
2016-05-04 10:43:08 +08:00
咦, byr !
luohaha
2016-05-04 12:51:05 +08:00
@yurivvvvv 哈哈 对啊
lsmgeb89
2016-05-07 23:12:54 +08:00
Lisp 解释器用 C 写只要这点代码!以后也试试看……
luohaha
2016-05-08 00:53:40 +08:00
@lsmgeb89 是的,而且代码还可以精简
lcj2class
2016-05-08 09:01:17 +08:00
赞👍🏻
yangxin0
2016-05-10 10:00:09 +08:00
汉字都码进代码了....可以从外部文件读嘛,这样更容易做国际化
luohaha
2016-05-10 21:48:33 +08:00
@yangxin0 很有道理,多谢啦!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/275894

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX