Как загрузить интерпретатор 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 того же самого, поскольку это именно то, что он есть. Черт возьми, даже мой проект " придурок" пропускает метациркулярную оценку, если вы посмотрите достаточно близко.