2009-10-02 37 views
12

Tôi có một trình đọc Lisp viết bằng Java mà tôi đang nghĩ đến việc dịch sang C. (Hoặc có lẽ là C++). Đây là một bản hack khá hoàn chỉnh và hữu ích, do đó vấn đề chính là phân bổ lưu trữ động trong một ngôn ngữ không có rác bộ sưu tập. Nếu ai đó đã nghĩ điều này thông qua tôi muốn mượn mã của họ hơn là con số nó ra bản thân mình. (C không phải là ngôn ngữ yêu thích của tôi.)Tôi có thể tìm đầu đọc Lisp ở đâu?

Tất nhiên, có trình đọc Lisp không có ý nghĩa trừ khi bạn định làm điều gì đó với những thứ bạn đọc, vì vậy có lẽ tôi nên đặt câu hỏi, Tôi tìm ở đâu một lõi Lisp đơn giản được viết bằng C ?, nhưng theo kinh nghiệm của tôi, phần khó nhất không thể tránh khỏi khi viết một Lisp (phần nào đáng ngạc nhiên) là người đọc. Thêm vào đó, tôi không muốn có một nhà sưu tập rác; Tôi đang dự đoán một ứng dụng mà các cấu trúc danh sách sẽ được giải phóng nhiều hơn hoặc ít hơn bằng tay.

Trả lời

1

có rất nhiều triển khai Đề án nhúng, ra khỏi đỉnh đầu của tôi: SIOD, Guile, ChickenScheme, Scheme48 ....

+1

Tôi biết tôi có thể lấy một số mã ra khỏi các nguồn như vậy, nhưng chúng hơi nặng so với những gì tôi đang tìm kiếm. Rất nhiều thiết kế của họ được thúc đẩy bởi các yếu tố toàn cầu (đặc biệt là GC) không áp dụng ở đây. Tôi muốn một cái gì đó khá nhẹ --- cấu trúc dữ liệu Lisp cơ bản, một cái gì đó để đọc chúng, và các quy ước để giải phóng chúng. – airfoyle

+1

http://www.xlisp.org cũng khá nhỏ. – ephemient

4

Gary Knott của Interpreting Lisp là rất tốt đẹp. Bạn cũng có thể thử những người khác, như Jim Mayfield's Lisp. Có lẽ có rất ít Lisps ngoài kia ...

Bạn đã đề cập rằng bạn không thích C. Có thể bạn thích Haskell - trong trường hợp này bạn có thể thử "Write yourself a Scheme in 48 hours", một hướng dẫn thú vị (bạn có thể viết một trình thông dịch Scheme trong Haskell).

Cập nhật: Tôi biết rằng một Lisper hầu như không cảm thấy thoải mái khi sử dụng Haskell, nhưng hey, nó thoải mái hơn nhiều so với C (ít nhất là đối với tôi)! Bên cạnh đó, HAskell có một FFI tốt, vì vậy nó sẽ dễ dàng sử dụng trình đọc Lisp-Haskell làm thư viện tương thích với C.

Cập nhật 2: Nếu bạn muốn sử dụng XLisp, theo đề xuất của người dùng khác, có thể bạn sẽ cần src/xlread.c (863 dòng) và include/xlisp.h (1379 dòng) - nhưng tôi có thể sai ...

Cập nhật 3: Nếu bạn sử dụng Lisp của Gary Knott (một tệp C với 942 dòng), chữ ký hàm là int32 sread (void). Đây sẽ là sự lựa chọn của tôi nếu tôi không cần bất kỳ thứ gì lạ mắt (như macro đọc) hoặc được tối ưu hóa cao (có một giấy PDF mô tả cách mã được triển khai, vì vậy bạn sẽ không phải tìm đường trong mê cung). Tài liệu cho hàm này là:

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. 

Xem Lisp của Gary cũ và bạn cần phải thay đổi nó để biên dịch. Thay vì bao gồm linuxenv.h, bao gồm:

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

Ngoài ra, nó không hoạt động trong các máy 64-bit (tài liệu của sread sẽ cho bạn biết lý do tại sao ...)

Cập nhật 4: Có cũng là Scheme implementations bởi Nils Holm (có sách mô tả internals)

+2

Cảm ơn; Tôi sẽ xem xét điều Knott. Trên Haskell: Không có gì chống lại Haskell, nhưng nếu tôi muốn làm điều đó trong một môi trường chức năng đẹp, tôi sẽ làm điều đó trong Lisp :) – airfoyle

2

lispreader là một phân tích cú pháp tập tin Lisp đơn giản thực hiện trong đồng bằng C.

Nếu bạn muốn C++, bạn có thể khai thác xung quanh trong t anh ta SuperTux source code, nó chứa một trình phân tích cú pháp tệp Lisp được viết bằng C++.

Khi bạn muốn triển khai thực hiện Lisp thay vì chỉ một trình phân tích cú pháp, bạn có thể xem Abuse, trong đó có một ngôn ngữ nhỏ làm ngôn ngữ kịch bản trò chơi.

+1

Bây giờ, tại sao điều đó làm tôi nghĩ đến Quy tắc thứ mười một của Greenspun? :) – ephemient

2

MIT Giáo sư Rivest đã công bố một loạt các độc giả nhỏ cho s-biểu thức trở lại vào năm 1997 http://people.csail.mit.edu/rivest/sexp.html như một phần của mình DARPA hỗ trợ nghiên cứu về mật mã hóa khóa công khai. Mã này chỉ đọc và in và được mô tả rõ ràng trong một tài liệu được viết theo phong cách của một RFC internet.

Các vấn đề liên quan