Я хочу реализовать схему интерпретатора для изучения SICP - PullRequest
7 голосов
/ 23 сентября 2011

Я читаю книгу Структура и интерпретация компьютерных программ , и я хотел бы постепенно закодировать интерпретатор схемы.

Знаете ли вы реализацию схемы наиболее легко читаемой (и краткой)? Я сделаю JavaScript в C.

Ответы [ 6 ]

7 голосов
/ 24 сентября 2011

В самом SICP есть несколько разделов, в которых подробно описывается, как создать мета-циклический интерпретатор, но я бы посоветовал вам взглянуть на следующие две книги, чтобы лучше узнать о интерпретаторах Scheme: Языки программирования: применение и интерпретация и Основы языков программирования . Они оба легко читаются и постепенно помогают вам создавать переводчиков.

4 голосов
/ 24 сентября 2011

Книга Кристиана Квиннека "Лисп в маленьких кусочках" великолепна.Более современный, чем EoPL.Охватывает и Лисп, и Схему, и подробно рассказывает о кровавых низкоуровневых вещах, которые пропускают большинство книг.

3 голосов
/ 27 ноября 2011

Я бы порекомендовал блог серии Схема с нуля , которая постепенно создает интерпретатор схемы в C.

1 голос
/ 18 октября 2011

Я бы рекомендовал прочитать диссертацию Кента Дибвига " Три модели реализации для схемы ".Не вся диссертация, а первая часть (до главы 3), где он обсуждает модель на основе кучи, очень подходит для наивной реализации Схемы.

Еще один замечательный ресурс (если я правильно понял, и выхочу реализовать это в C) * Nils Holm "Схема 9 из пустого пространства" .Эта ссылка находится на странице Нильса, а внизу есть ссылка на старое, общедоступное издание, издание книги и на новое, более удобное для чтения, коммерчески доступное издание.Прочитайте оба и любите их.

0 голосов
/ 25 октября 2013

Я был на аналогичной миссии, но несколько лет спустя, рекомендации:

  • Схема Питера Мишо с нуля: http://michaux.ca/articles/scheme-from-scratch-introduction, и его репозиторий github: https://github.com/petermichaux/bootstrap-scheme/blob/v0.21/scheme.c. К сожалению, его усилия по королевской схеме, похоже, зашли в тупик. Были обещания В.М., которые с его ясностью объяснений были бы великолепны.
  • Peter Norvigs lis.py: http://norvig.com/lispy.html, хотя и написан на python, он очень понятен и использует все преимущества использования динамического языка со слабой типизацией для создания другого. У него есть статья, которая добавляет более продвинутые функции.
  • Энтони С. Хей использовал lis.py как источник вдохновения для создания реализации на C ++: http://howtowriteaprogram.blogspot.co.uk/2010/11/lisp-interpreter-in-90-lines-of-c.html
  • Более полной реализацией является схема chibi: http://synthcode.com/scheme/chibi/, которая включает в себя виртуальную машину, но кодовая база все еще не слишком велика для понимания.

Я все еще ищу хорошие посты в блоге о создании виртуальной машины с lisp / схемой, которая может быть связана с JIT (важно для любой конкурентной реализации JS:).

0 голосов
/ 18 июня 2012

Я могу дать вам общее представление о том, как работает мой переводчик, возможно, он может дать вам общее представление. Хотя ответ довольно поздний, я надеюсь, что это может помочь кому-то еще, кто зашел в эту ветку и хочет получить общую идею.

  1. Для каждой введенной строки схемыКомандный объект создан.Если команда является частичной, то сохраняется уровень ее гнезда (количество оставшихся правых скобок для завершения выражения).Если команда завершена, объект Expression создан и для этого объекта запущены оценщики.
  2. Определено 4 типа классов оценщика, каждый из которых получен из базового класса Evaluator

a) Define_Evaluator: для определений операторов

b) Funcall_Evaluator: для обработки других пользовательских функций

c) Read_Evaluator: для чтения выражения и преобразования его в объект схемы

d) Print_Evaluator: печатает объект в зависимости от типа объекта.

e) Eval_Evaluator: выполняет фактическую обработку выражения.

3 .-> Сначала каждое выражение читается с использованиемПрочитайте Evaluator, который создаст объект схемы из выражения.Вложенные выражения вычисляются рекурсивно до тех пор, пока выражение не будет завершено.

-> Далее запускается Eval_Evaluator, который обрабатывает объект выражения схемы, сформированный на первом шаге.это происходит так

a) если вычисляемое выражение является символом.Верните его значение.Поэтому переменная blk вернет объект для этого блока.

b), если вычисляемое выражение является списком.Распечатайте список.

c) если вычисляемое выражение является функцией.Найдите определение функции, которая будет возвращать оценку, используя Funcall_Evaluator.

-> Наконец, оценщик печати запускается для печати результата, эта печать будет зависеть от типа выходного выражения.

Отказ от ответственности: Так работает мой переводчик, так не должно быть.

...