Как загрузить интерпретатор Lisp с помощью метациркуляционного оценщика

Я реализую интерпретатор Lisp в чистом C и у меня возникают проблемы при переходе с C на Lisp.

Следуя шагам Питера Норвига в своем блоге, у меня есть REPL, который до сих пор анализирует выражения Lisp в структурах данных Lisp и сериализует полученную структуру данных обратно в выражение lisp, которое печатается, как показано ниже:

Я также реализовал семь примитивов, описанных Полом Грамом, и понимаю метациркулярную оценку в них. Мои проблемы возникают при написании части кода C (не lisp!), Которая фактически выполняет структуру данных после того, как она была проанализирована ("eval") на изображении, показанном выше.

Насколько я понимаю, с помощью метациркуляционного оценщика можно написать семантику оценки процедур Lisp в самом Lisp. Из-за этого я хочу оставить эту часть программы в lisp, однако кажется очевидным, что в какой-то момент мне нужно написать код C, который фактически применяет примитивы или процедуры к структурам данных Lisp. Однако, когда я собираюсь написать этот код, я обнаруживаю, что пишу ту же логику, что и метациркулярный оценщик, только версию C.

У меня вопрос, нужно ли мне внедрять eval а также apply в C (как Питер Норвиг сделал в Python) или есть ли какой-нибудь способ загрузить интерпретатор lisp, где единственная реализация eval а также apply на самом деле написаны на Лиспе?

1 ответ

Решение

Это невозможно осуществить eval а также apply в lisp, если вы делаете переводчика на C. Причина в том, что вам нужен какой-то способ интерпретации интерпретатора, и у вас возникнет проблема с начальной загрузкой.

Вы можете сделать его минимальным, используя данные. Например, весь примитивный синтаксис имеет тег и указатель на функцию, которая принимает выражение и окружение. В основном символ quote можете оценить это, и у вас есть вызов функции eval. Все примитивные функции имеют тег + указатель на функцию, а затем apply а также eval будет гораздо меньше делать и легче расширять.

Вы правы в том, что eval а также apply будет чувствовать себя как эквивалент C того же самого, поскольку это именно то, что он есть. Черт возьми, даже мой проект " придурок" пропускает метациркулярную оценку, если вы посмотрите достаточно близко.

Другие вопросы по тегам