Где я могу найти читатель Lisp в C? - PullRequest
12 голосов
/ 03 октября 2009

У меня есть программа для чтения Lisp, написанная на Java, которую я собираюсь перевести на C. (Или, возможно, C ++.) Это довольно полный и полезный хак, поэтому основная проблема заключается в распределении динамического хранилища на языке без вывоз мусора. Если кто-то уже обдумал это, я бы лучше позаимствовал их код, чем сам разбирался. (C не мой любимый язык.)

Конечно, иметь читателя на Лиспе нет смысла, если вы не планируете что-то делать с тем, что читаете, поэтому, возможно, мне следовало бы сформулировать вопрос: где мне найти простое ядро ​​Лиспа, написанное на С? по моему опыту, самой трудной и неизбежной частью написания Лиспа (что несколько удивительно) является читатель. Плюс, я не хочу иметь сборщика мусора; Я ожидаю приложения, в котором структуры списков будут более или менее освобождены вручную.

Ответы [ 5 ]

4 голосов
/ 03 октября 2009

Gary Knott's Интерпретация Lisp очень хороша. Вы также можете попробовать другие, например Lisp Джима Мэйфилда. Там, наверное, много маленьких Лиспов ...

Вы упомянули, что вам не нравится C. Может быть, вы хотели бы Haskell - в этом случае вы можете попробовать "Напишите себе схему за 48 часов" , интересное руководство (вы получите написать интерпретатор Scheme в Haskell).

Обновление: Я знаю, что лисперу вряд ли будет комфортно пользоваться Haskell, но эй, это намного удобнее, чем C (по крайней мере, для меня)! Кроме того, HAskell имеет хороший FFI, поэтому должно быть легко использовать созданный на Haskell Lisp-ридер в качестве C-совместимой библиотеки.

Обновление 2: Если вы хотите использовать XLisp, как предложено другим пользователем, вам, вероятно, понадобится src / xlread.c (863 строки) и include / xlisp.h (1379 строк) - но я могу ошибаться ...

Обновление 3: Если вы используете Lisp Гэри Кнотта (один файл C с 942 строками), сигнатура функции - 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.

Обратите внимание, что Лисп Гэри старый, и вам нужно изменить его, чтобы он компилировался. Вместо включения linuxenv.h включите:

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

Кроме того, он не работает на 64-битных машинах (документация sread должна объяснить, почему ...)

Обновление 4 : есть также реализация схемы Нильса Холма (есть книги, описывающие внутреннее устройство)

3 голосов
/ 28 сентября 2010
2 голосов
/ 07 августа 2012

MIT Профессор Ривест опубликовал набор небольших ридеров для s-выражений еще в 1997 году http://people.csail.mit.edu/rivest/sexp.html в рамках своего исследования DARPA по криптографии с открытым ключом. Код только выполняет чтение и печать и хорошо описан в документе, написанном в стиле Интернет RFC.

2 голосов
/ 05 октября 2009

lispreader - это простой анализатор файлов Lisp, выполненный в простом C.

Если вам нужен C ++, вы можете покопаться в исходном коде SuperTux , он содержит анализатор файлов Lisp, написанный на C ++.

Если вам нужна реальная реализация Lisp вместо просто парсера, вы можете взглянуть на Abuse , в котором в качестве языка сценариев игры есть маленькая.

1 голос
/ 03 октября 2009

Есть много встраиваемых реализаций Scheme, от всей головы: SIOD , Guile , ChickenScheme , Scheme48 . ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...