Лучший способ узнать это наверняка - это реализовать его. Я использовал 3 лета, чтобы создать Zozotez , который представляет собой LISP McCarty-ish, работающий на Brainfuck .
Я попытался выяснить, что мне нужно, и на форуме вы найдете ветку, которая говорит: Вам нужна только лямбда. Таким образом, вы можете сделать целый LISP в лямбда-исчислении, если хотите , Мне это показалось интересным, но вряд ли это можно сделать, если вы хотите что-то, что в конечном итоге имеет побочные эффекты и работает в реальном мире.
Для полного LISP по Тьюрингу я использовал Пол Грэмс, объяснение работы Маккарти , и все, что вам действительно нужно:
- символ-оценка * * 1016
- Специальная форма цитаты
- специальная форма if (или cond)
- специальная форма лямбда (аналог цитаты)
- функция eq
- функция атома
- функция минусов
- функциональная машина
- функция cdr
- функция-диспетчеризация (в основном применяется, но фактически не отображается в системе, поэтому обрабатывает список, в котором первый элемент является функцией)
То есть 10. В дополнение к этому, чтобы иметь реализацию, которую можно тестировать, а не только на чертежной доске:
- функция чтения
- функция записи
Thats 12. В моем Zozotez я также реализовал set
и flambda
(анонимные макросы, такие как лямбда). Я мог бы передать ей библиотеку, реализующую любой динамический связанный lisp (Elisp, picoLisp), за исключением файлового ввода-вывода (потому что базовый BF не поддерживает его, кроме stdin / stdout).
Я рекомендую любому реализовать LISP1-интерпретатор как в LISP
, так и (not LISP)
, чтобы полностью понять, как реализован язык. У LISP очень простой синтаксис, так что это хорошая отправная точка. Для всех других языков программирования способ реализации интерпретатора очень похож. Например. в видео SICP мастера создают интерпретатор для логического языка, но структура и способы его реализации очень похожи на интерпретатор lisp, хотя этот язык полностью отличается от Lisp.