V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
luohaha
V2EX  ›  分享创造

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

  •  1
     
  •   luohaha · 2016-05-02 23:28:33 +08:00 · 3006 次点击
    这是一个创建于 2915 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 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 。

    10 条回复    2016-05-10 21:48:33 +08:00
    a302800411
        1
    a302800411  
       2016-05-03 09:43:48 +08:00 via Android
    赞~
    luohaha
        2
    luohaha  
    OP
       2016-05-03 14:09:25 +08:00 via Android
    @a302800411 多谢!
    petelin
        3
    petelin  
       2016-05-03 22:18:34 +08:00 via Android
    Mark
    yurivvvvv
        4
    yurivvvvv  
       2016-05-04 10:43:08 +08:00
    咦, byr !
    luohaha
        5
    luohaha  
    OP
       2016-05-04 12:51:05 +08:00 via Android
    @yurivvvvv 哈哈 对啊
    lsmgeb89
        6
    lsmgeb89  
       2016-05-07 23:12:54 +08:00 via Android
    Lisp 解释器用 C 写只要这点代码!以后也试试看……
    luohaha
        7
    luohaha  
    OP
       2016-05-08 00:53:40 +08:00 via Android
    @lsmgeb89 是的,而且代码还可以精简
    lcj2class
        8
    lcj2class  
       2016-05-08 09:01:17 +08:00 via iPhone
    赞👍🏻
    yangxin0
        9
    yangxin0  
       2016-05-10 10:00:09 +08:00 via iPhone
    汉字都码进代码了....可以从外部文件读嘛,这样更容易做国际化
    luohaha
        10
    luohaha  
    OP
       2016-05-10 21:48:33 +08:00
    @yangxin0 很有道理,多谢啦!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3842 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:08 · PVG 13:08 · LAX 22:08 · JFK 01:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.