我在哪里可以找到C中的Lisp阅读器?

时间:2009-10-02 20:23:08

标签: c lisp

我有一个用Java编写的Lisp读者,我正在考虑将其翻译成C.(或者也许是C ++。)这是一个相当完整和有用的黑客,所以主要的问题是用一种语言进行动态存储分配垃圾收集。如果有人已经想到这一点,我宁可借用他们的代码而不是自己弄明白。 (C不是我最喜欢的语言。)

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

5 个答案:

答案 0 :(得分:4)

Gary Knott的Interpreting Lisp非常好。 您也可以尝试其他人,例如Jim Mayfield's Lisp。那里可能有很多小Lisps ......

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

更新:我知道Lisper在使用Haskell时会觉得不舒服,但是嘿,它比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(有书籍描述内幕)

答案 1 :(得分:3)

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

MIT教授Rivest在1997年发表了一系列关于s表达式的小读者http://people.csail.mit.edu/rivest/sexp.html,作为他的DARPA支持公钥加密研究的一部分。该代码仅进行读取和打印,并在以互联网RFC风格编写的文档中有详细描述。

答案 4 :(得分:1)

我的头脑中有许多可嵌入的Scheme实现:SIODGuileChickenSchemeScheme48 ....