Действительно минимальный шут

Какой минимальный набор примитивов требуется для того, чтобы язык был полным по Тьюрингу и вариантом lisp?

Похоже, автомобиль, CDR и некоторые управления потоком и что-то для REPL достаточно. Было бы хорошо, если бы был такой список.

Предположим, есть только 3 типа данных, целые числа, символы и списки (как в picolisp).

5 ответов

Решение

Это хорошо обсуждается в FAQ по Lisp. Это зависит от вашего выбора примитивов. Оригинальное "Руководство программиста LISP 1.5" Маккарти сделало это с пятью функциями: CAR, CDR, CONS, EQ и ATOM.

Лямбда-исчисление завершается. У него есть один примитив - лямбда. Переводить его в синтаксис LISP довольно тривиально.

Я считаю, что минимальный набор - это то, что Джон Маккарти опубликовал в оригинальной статье.

Корни Лиспа.

Код.

Лучший способ узнать это наверняка - это реализовать его. Я использовал 3 лета для создания Zozotez, который представляет собой LISP McCarty-ish, работающий на Brainfuck.

Я попытался выяснить, что мне нужно, и на форуме вы найдете ветку, в которой говорится, что вам нужна только лямбда. Таким образом, вы можете сделать целый LISP в лямбда-исчислении, если хотите. Мне это показалось интересным, но вряд ли это будет путь, если вы хотите что-то, что в конечном итоге имеет побочные эффекты и работает в реальном мире.

Для полного LISP по Тьюрингу я использовал объяснение Пола Грэмса о работе Маккарти, и все, что вам действительно нужно, это:

  • Символ-оценка
  • специальная форма цитаты
  • специальная форма if (или cond)
  • специальная форма лямбда (аналог цитаты)
  • функция эквалайзер
  • функциональный атом
  • функции минусы
  • функциональная машина
  • функция CDR
  • функция-диспетчеризация (в основном применяется, но фактически не отображается в системе, поэтому обрабатывает список, в котором первый элемент является функцией)

Thats 10. В дополнение к этому, чтобы иметь реализацию, которую вы можете тестировать, а не только на чертежной доске:

  • функция чтения
  • функция записи

Thats 12. В моем Zozotez я реализовал set а также flambda (анонимные макросы, такие как лямбда), а также. Я мог бы снабдить его библиотекой, реализующей любой динамический связанный lisp (Elisp, picoLisp), за исключением файлового ввода-вывода (потому что базовый BF не поддерживает его, кроме stdin/stdout).

Я рекомендую всем реализовать LISP1-интерпретатор, как в LISP а также (not LISP), чтобы полностью понять, как язык реализован. У LISP очень простой синтаксис, так что это хорошая отправная точка. Для всех других языков программирования способ реализации интерпретатора очень похож. Например. в видео SICP мастера создают интерпретатор для логического языка, но структура и способы его реализации очень похожи на интерпретатор lisp, хотя этот язык полностью отличается от Lisp.

Другие вопросы по тегам