【问题标题】:Where can I find a Lisp reader in C?我在哪里可以找到 C 语言中的 Lisp 阅读器?
【发布时间】:2010-12-03 10:54:35
【问题描述】:

我有一个用 Java 编写的 Lisp 阅读器,我正在考虑将其翻译成 C。(或者可能是 C++。)这是一个相当完整和有用的 hack,所以主要问题是在没有的语言中进行动态存储分配垃圾收集。如果有人已经考虑过这一点,我宁愿借用他们的代码,也不愿自己弄清楚。 (C 不是我最喜欢的语言。)

当然,拥有一个 Lisp 阅读器是没有意义的,除非你打算对你阅读的内容做点什么,所以也许我应该提出这个问题,我在哪里可以找到一个用 C 编写的简单 Lisp 核心?以我的经验,编写 Lisp 最难避免的部分(有点令人惊讶)是读者。另外,我不想有垃圾收集器;我期待一个应用程序可以或多或少地手动释放列表结构。

【问题讨论】:

    标签: c lisp


    【解决方案1】:

    Gary Knott 的Interpreting Lisp 非常好。 你也可以试试其他的,比如Jim Mayfield'sLisp。那里可能有很多小 Lisp...

    您提到您不喜欢 C。也许您喜欢 Haskell——在这种情况下,您可以尝试 "Write yourself a Scheme in 48 hours",这是一个有趣的教程(您可以在 Haskell 中编写一个 Scheme 解释器)。

    更新:我知道使用 Haskell 的 Lisper 几乎不会觉得舒服,但是嘿,它比 C 舒服得多(至少对我来说)!除此之外,HAskell 有一个很好的 FFI,所以使用 Haskell 制造的 Lisp 阅读器作为 C 兼容库应该很容易。

    更新 2: 如果您想使用 XLisp,正如其他用户所建议的那样,您可能需要 src/xlread.c(863 行)和 include/xlisp.h(1379 行)- - 但我可能是错的......

    更新 3: 如果您使用 Gary Knott 的 Lisp(一个 942 行的单个 C 文件),函数签名是 int32 sread(void)。如果我不需要任何花哨的东西(比如读取宏)或高度优化的东西(有一篇 PDF 论文描述了代码是如何实现的,所以你不必在迷宫中找到自己的方式),这将是我的选择。该函数的文档是:

    This procedure scans an input string g using a lexical token scanning
    routine, e(), where e() returns
                        1 if the token is '('
                        2 if the token is '''
                        3 if the token is '.'
                        4 if the token is ')'   or a typed pointer d to an
    atom or number stored in row ptrv(d) in   the atom or number tables.
    Due to the typecode (8 or 9) of d, d is a negative 32-bit integer.  The
    token found by e() is stripped from the front of g.
    
    SREAD constructs an S-expression and returns a typed pointer to it as
    its result.
    

    看到 Gary 的 Lisp 已经过时,您需要对其进行更改以便编译。不包括 linuxenv.h,而是包括:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <setjmp.h>
    

    另外,它在 64 位机器上也不起作用(sread 的文档应该会告诉你原因……)

    更新 4:还有 Nils Holm 的 Scheme implementations(有描述内部结构的书籍)

    【讨论】:

    • 谢谢;我会调查诺特的事情。关于 Haskell:没有什么反对 Haskell,但如果我想在一个漂亮的功能环境中做,我会在 Lisp 中做 :)
    【解决方案2】:
    【解决方案3】:

    lispreader 是一个用纯 C 语言完成的简单 Lisp 文件解析器。

    如果你想要 C++,你可以在 SuperTux source code 中挖掘,它包含一个用 C++ 编写的 Lisp 文件解析器。

    如果您想要一个 Lisp 的实际实现而不仅仅是一个解析器,您可以查看 Abuse,其中包含一个小的游戏脚本语言。

    【讨论】:

    • 现在,为什么这让我想起了格林斯潘的第十条规则? :)
    【解决方案4】:

    麻省理工学院 Rivest 教授早在 1997 年就发表了一组关于 s 表达式的小读者http://people.csail.mit.edu/rivest/sexp.html,作为 DARPA 支持的公钥密码学研究的一部分。该代码仅用于读取和打印,并且在以互联网 RFC 风格编写的文档中进行了很好的描述。

    【讨论】:

      【解决方案5】:

      有很多可嵌入的 Scheme 实现,我想不到:SIODGuileChickenSchemeScheme48....

      【讨论】:

      • 我知道我可以从这些资源中获取一些代码,但它们对于我正在寻找的东西来说有点太重了。他们的许多设计都受到不适用于此处的全局因素(尤其是 GC)的推动。我想要一些相当轻量级的东西——基本的 Lisp 数据结构,可以读取它们的东西,以及释放它们的约定。
      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 2012-10-27
      相关资源
      最近更新 更多