Действительно минимальный Лисс
-
02-10-2019 - |
Вопрос
Какой минимальный набор примитивов требуется такой, чтобы язык был завершен, а вариант Lisp?
Похоже, автомобиль, CDR и некоторый контроль потока и что-то для ревки достаточно. Будь хорошим, если есть такой список.
Предположим, что есть только 3 типа данных, целых чисел, символов и списков. (Как в Picolisp)
Решение
Там хорошая дискуссия об этом в FAQ FAQ. Отказ Это зависит от вашего выбора примитивов. Оригинальный «Risp 1.5 Risp 1.5 Risp 1.5» сделал это с пятью функциями: автомобиль, CDR, минусы, эквалайзер и атом.
Другие советы
То лямбда исчисления это завершено. У него есть один примитивный - лямбда. Перевод, что на синтаксис Lisp довольно тривиально.
Я верю, что минимальный набор - это то, что Джон Маккарти опубликовал в оригинальной статье.
Код.
Лучший способ на самом деле знать это точно, если вы его реализуете. Я использовал 3 лежа для создания Zozotez. На котором находится Лисп Маккарти Мозги.
Я пытался выяснить, что мне нужно, и на форуме вы найдете тему, которая говорит Вам нужна только лямбда. Таким образом, вы можете сделать целый Lisp в Lambda Calculus, если вы хотите. Я нашел это интересно, но вряд ли есть способ пойти, если вы хотите что-то, что в конце концов есть побочные эффекты и работает в реальном мире.
Для Turing Complete Lisp я использовал Пол Грахамс Объяснение бумаги Маккарти И все, что вам действительно нужно, это:
- Оценка символов
- Специальная форма цитата
- Особая форма, если (или кондицион)
- Специальная форма лямбда (похожа на цитату)
- Функция EQ.
- Функция атома
- Функция минус
- Функция автомобиля
- Функция CDR.
- Функциональная отправка (в основном применить, но фактически не подвергаться воздействию системы, чтобы она обрабатывала список, где первый элемент является функцией)
Это 10. В дополнение к этому, иметь реализацию, которую вы можете проверить, а не только на чертежной доске:
- Функция чтения
- Функция записи
Это 12. в моем Zozotez. Я назначаю set
а также flambda
(анонимные макросы, как лямбда), как и лямбда). Я мог бы накорлить его библиотеку, реализующую любой динамический связанный Lisp (ELISP, PicoLisp), за исключением файла ввода / вывода (потому что базовый BF не поддерживает его, отличный от stdin / stdout).
Я рекомендую всем, чтобы реализовать LISP1-интерпретатор, в обоих LISP
а также (not LISP)
, чтобы полностью понять, как реализован язык. У Lisp очень простой синтаксис, так что это хорошая отправная точка. Для всех других языков программирования, как вы реализуете интерпретатор, очень похоже. Например. в SiCP видео Волшебники делают интерпретатор для логического языка, но структуру и как реализовать ее очень похоже на переводчик Lisp, даже если этот язык совершенно отличается от Lisp.