Действительно минимальный шут - PullRequest
7 голосов
/ 28 апреля 2010

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

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

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

Ответы [ 4 ]

12 голосов
/ 28 апреля 2010

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

6 голосов
/ 28 апреля 2010

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

5 голосов
/ 28 апреля 2010

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

Корни Лиспа .

Код .

2 голосов
/ 28 февраля 2016

Лучший способ узнать это наверняка - это реализовать его. Я использовал 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.

...