Я читаю книгу Структура и интерпретация компьютерных программ em>, и я хотел бы постепенно кодировать интерпретатор схемы.
Знаете ли вы реализацию схемы наиболее легко читаемой (и короткой)? Я сделаю JavaScript на C.
Я читаю книгу Структура и интерпретация компьютерных программ em>, и я хотел бы постепенно кодировать интерпретатор схемы.
Знаете ли вы реализацию схемы наиболее легко читаемой (и короткой)? Я сделаю JavaScript на C.
Сам SICP имеет несколько разделов, подробно описывающих, как создать метакруговой интерпретатор, но я бы посоветовал вам взглянуть на следующие две книги для получения лучших ресурсов по интерпретаторам Scheme: Языки программирования: применение и интерпретация и Основы языков программирования . Их легко читать, и они постепенно проведут вас через создание интерпретаторов.
Я бы порекомендовал серию блогов Схема с нуля, в которой поэтапно создается интерпретатор схем в С.
Книга Кристиана Квиннека Lisp In Small Pieces превосходна. Более современный, чем EoPL. Охватывает как Lisp, так и Scheme, и подробно описывает кровавые низкоуровневые вещи, опущенные в большинстве книг.
Я бы рекомендовал прочитать диссертацию Кента Дибвига "Три модели реализации для схемы". Не вся диссертация, но первая часть (до главы 3), где он обсуждает Heap-Based Model, очень подходит для наивной реализации Scheme.
Еще один замечательный ресурс (если я правильно его понял и вы хотите реализовать его на C) — это Нильса Холма "Схема 9 из пустого пространства" а>. Эта ссылка ведет на страницу Нильса, а внизу есть ссылка на старое общедоступное издание книги и на более новое, более легкое для чтения, коммерчески доступное издание. Прочитал оба и полюбил их.
Я могу дать вам обзор того, как работает мой интерпретатор, возможно, это даст вам общее представление. Хотя ответ довольно поздний, я надеюсь, что это может помочь кому-то еще, кто пришел в эту тему и хочет получить общее представление.
а) Define_Evaluator: для операторов определения
б) Funcall_Evaluator: для обработки других пользовательских функций.
c) Read_Evaluator: для чтения выражения и преобразования его в объект схемы.
г) Print_Evaluator: печатает объект в зависимости от типа объекта.
e) Eval_Evaluator: выполняет фактическую обработку выражения.
3.-> Сначала каждое выражение считывается с помощью Read Evaluator, который создает объект схемы из выражения. Вложенные выражения вычисляются рекурсивно, пока выражение не будет завершено.
-> Далее запускается Eval_Evaluator, который обрабатывает объект выражения схемы, сформированный на первом этапе. это происходит так
а) если оцениваемое выражение является символом. Верните его значение. Поэтому переменная blk вернет объект для этого блока.
б) если вычисляемое выражение является списком. Распечатайте список.
c) если вычисляемое выражение является функцией. Найдите определение функции, которая вернет оценку, используя Funcall_Evaluator.
-> Наконец, запускается оценщик печати для печати результата, этот вывод будет зависеть от типа выходного выражения.
Отказ от ответственности. Так работает мой интерпретатор, так быть не должно.
Я был в аналогичной миссии, но несколько лет спустя, рекомендации:
Я все еще ищу хорошие сообщения в блогах о создании виртуальной машины lisp/scheme, которая может быть связана с JIT (важно для любой конкурентной реализации JS :).
Помимо книги Квиннека, которая, вероятно, является наиболее полной в схеме в C, вы также можете прочитать литературу из старой библиотеки библиотеки .