2009-10-02 81 views
12

我有一個用Java編寫的Lisp閱讀器,我正在考慮將它翻譯爲C(或者C++)。這是一個相當完整和有用的黑客技術,因此主要問題是在沒有垃圾的情況下以動態存儲分配語言採集。如果有人已經想通過我寧願借用他們的代碼比自己想出來。 (C不是我最喜歡的語言。)我在哪裏可以找到C語言的Lisp閱讀器?

當然,除非你打算對你讀的東西做些什麼,否則擁有一個Lisp閱讀器是沒有意義的,所以也許我應該說出這個問題,我在哪裏可以找到一個簡單的用C語言編寫的Lisp核心,但以我的經驗來看,編寫Lisp最難的部分(有點令人驚訝的)是讀者。另外,我不想有垃圾收集器;我正在期待一個應用程序,其中列表結構將被手動或多或少地釋放。

回答

1

有很多嵌入式方案實現的,把我的頭頂部:SIODGuileChickenSchemeScheme48 ....

+1

我知道我可以從這些源代碼中獲取一些代碼,但它們對我所尋找的東西來說太重了。他們的許多設計都是受全球因素(特別是氣相色譜)驅動,這些因素在這裏不適用。我想要一些相當輕量級的東西 - 基本的Lisp數據結構,讀取它們的東西以及釋放它們的約定。 – airfoyle 2009-10-02 23:39:40

+1

http://www.xlisp.org也很小。 – ephemient 2009-10-03 04:59:17

4

加里·諾特的Interpreting Lisp是非常好的。 您也可以嘗試其他人,如Jim Mayfield's Lisp。有可能很多小Lisp在那裏...

你提到你不喜歡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線)和包括/ xlisp.h(1379線), - 可是我是錯誤的...

更新3:如果使用加里·諾特的Lisp語言(與942線一個單一的C文件),該函數簽名是INT32 SREAD(無效)。如果我不需要任何花哨的東西(比如讀取宏)或高度優化(這裏有一篇描述代碼如何實現的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. 

看到加里的Lisp是舊的,你需要改變它,所以它編譯。相反,包括linuxenv.h的,包括:

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

而且,它不會在64位機器上工作(SREAD的文檔會告訴你爲什麼...)

更新4:有也Scheme implementations由尼爾斯·霍爾姆(有說明內部書籍)

+2

謝謝;我會研究Knott的事情。 關於Haskell:沒有任何反對Haskell,但如果我想在一個美麗的功能環境中做到這一點,我只會在Lisp中做到這一點:) – airfoyle 2009-10-24 20:22:35

2

lispreader是平原C.

做一個簡單的Lisp文件分析器如果你想C++,你可以在T周圍挖他SuperTux source code,它包含一個用C++編寫的Lisp文件解析器。

當你想要一個實際的Lisp實現而不是一個解析器時,你可以看看Abuse,它包含一個小的遊戲腳本語言。

+1

現在,爲什麼這讓我想到了Greenspun的第十條規則? :) – ephemient 2009-10-06 18:14:18

2

麻省理工學院的Rivest教授出版了一套小讀者s表達式1997年http://people.csail.mit.edu/rivest/sexp.html早在他DARPA公共密鑰加密支持的研究的一部分。該代碼僅用於閱讀和打印,並且在以RFC格式編寫的文檔中有很好的描述。

相關問題