Подтвердить что ты не робот

Где я могу найти читателя Lisp в C?

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

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

4b9b3361

Ответ 1

Гари Нотт Интерпретация Lisp очень приятная. Вы также можете попробовать другие, например Jim Mayfield's Lisp. Там, вероятно, много маленьких Lispов...

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

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

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

Обновление 3: Если вы используете Gary Knott 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.

Посмотрите, что Gary Lisp устарел, и вам нужно будет его изменить, чтобы он компилировался. Вместо включения linuxenv.h включить:

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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