LISP

Материал из свободной русской энциклопедии «Традиция»
Перейти к навигации Перейти к поиску

Лисп (LISP, от англ. LISt Processing — «обработка списков») — семейство языков программирования, основанных на представлении программы активной-реального-времени-символьно системой линейных списков символов, которые притом являются основной структурой данных языка. Лисп считается вторым после Фортрана старейшим высокоуровневым языком программирования.

  • Активная система - каждый символ является динамической системой живущей в лисп-среде;
  • Реального времени - реагирует на команды, события и проч.;
  • Символьная система - реализует абстракцию, идею ламбда-исчисления, т.е. символы живут в свое родной среде. Возможность которая радикально определяет мир компьютеров.


Лисп (lisp) имеет также значение «детский лепет» — тема интересовавшая создателя Лиспа Мак-Карти The robot and the baby и весь Стенфорд. (Самые ходовые связки ИИ: ИИ — разведка (intelligence), ИИ — дети люди/киборги/роботы.)

Наиболее успешная платформа баз знаний на Лиспе KEE (Knowledge Engineering Enveronment).

В стандарте Common Lisp (каждый) символ реализован как узел многокоординатной опять же символьной сети. Координаты, свойства, уровни сети записаны в ящичках (slots) символа. Основные слоты: имя символа (основополагающее аристотелево А=А), функциональный слот, слот значение, расширяемый список свойств (можно сказать микромир самого символа).

Традиционный Лисп имеет строгую динамическую систему типов, содержит императивные свойства, но в общем поощряет функциональную парадигму программирования.

Полноценная символьная обработка подразумевает возможность создания любого профиля объектно-ориентированного программирования (то есть реализация полного ООП имеющего тот или иной характер средствами языка). Кодификацией, стандартизацией профиля ООП в стандарте Лиспа является платформа CLOS.

Внешне исходный код программы на Лиспе отличается обилием круглых скобок; редактирование программ значительно упрощается использованием текстового редактора, поддерживающего автоматическое выравнивание кода, подсветку соответствующих пар скобок и команды рода «перейти через список вправо». Хорошо приспособлен к кодированию на Лиспе редактор Emacs (большая часть которого написана на Лиспе), кроме того в коммерческих реализациях (например в LispWorks) IDE содержит удобные редакторы, сохраняющие все достоинства Emacs.

Язык Лисп наряду с языком Ada прошёл процесс фундаментальной стандартизации для использования в военном деле и промышленности, в результате чего появился стандарт Common Lisp. Его реализации существуют для большинства платформ. Есть реализации распространяемые свободно под лицензиями, позволяющими использовать Лисп без ограничений в коммерческих приложениях, кроме этого существуют коммерческие реализации, предлагающие дополнительные возможности (IDE, дополнительные библиотеки и т. п.), в том числе техническую поддержку. С полным списком реализаций можно ознакомиться здесь: Common Lisp Implementation.

Синтаксис[править | править код]

Основной механизм Лиспа, инкапсулированная в список определяющая голова списка, и подключенный к ней хвост списка, который рекурсивно также может быть списком (ламбда-исчисление). Лисп-машина способна воспринимать каждый поступающий на неё список на самом абстрактном уровне, например как мета-Лисп-машину модифицирующую воспринимающую машину. В такой динамичной, высокоабстрактной среде можно реализовать как строго-научные системы, так и неисчислимое множество программистских трюков и генераторов всевозможных машин.

Любая программа на Лиспе состоит из последовательности выражений (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде списков — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка.

Список является последовательностью элементов любого рода, в том числе других списков. Например, (1 3/7 'foo #'+) состоит из целого числа, рациональной дроби, символа foo и указателя на функцию сложения. Выражения представляются списками в префиксной записи: первый элемент должен быть формой, то есть функцией, оператором, макросом или специальным оператором; прочие элементы суть аргументы, передаваемые форме для обработки. Функция list возвращает список состоящий из её аргументов: например, (list 1 3/7 'foo #'+) возвращает список, упомянутый ранее. Если некоторые элементы являются выражениями, то сначала вычисляется их значение: (list 1 2 (list 1 2)) возвращает (1 2 (1 2)). Арифметические операторы действуют так же, например (+ 4 (* 2 3)) выдаёт 10.

Специальные операторы позволяют управлять последовательностью вычислений. С их помощью реализуются ветвление и циклы. Оператор if позволяет вычислить одно из двух выражений в зависимости от выполнения условия, которое тоже является выражением. Если его результат не nil, то вычисляется первый аргумент, иначе вычисляется второй. Например, (if nil (list 1 2 "foo") (list 3 4 "bar")) всегда возвращает (3 4 "bar").

Символьная природа языка (то есть отсутствие в символьном пространстве традиционной метрической геометрии расстояний, последовательностей и т.д) позволяет легко и продуктивно распараллеливать Лисп-процессы. (Что нашло использование в сверхмощных телекоммуникационных, сетевых Лисп-системах.)

При всей мощности символьного подхода, он не может занять место контининтуальных (нейро) систем (не-машин!) нейрокомпьютеров. Т. н. проблема образования категорий из сенсорных данных. (см. Harnad).

Примеры[править | править код]

Пример куайна (программы, выводящей свой исходный код) на Лиспе:

((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))

Данная программа должна работать на большинстве диалектов Лиспа, в том числе и на Scheme.

Итеративная версия функции определения N-го числа Фибоначчи:

(defun fibonacci (x)
  (if (= x 0) 
      1 
      (loop with result = 1
	    with prev = 1
            for i from 0 below (1- x) 
            do (psetq result (+ result prev) prev result))))

Применение[править | править код]

Основная область применения Лиспа — динамическая генерация символьных миров и последующий процесс принятия решений (см. проекты Franz).

Одно из направлений использования языка Lisp — его использование в качестве скриптого языка, автоматизирующего работу в ряде прикладных программ.

  • Лисп используется как язык сценариев в САПР AutoCAD (диалект AutoLISP)
  • Лисп является одним из базовых средств текстового редактора Emacs (Диалект EmacsLISP). По сути, большая часть Emacs написана на EmacsLISP, что даёт неограниченные возможности расширения функциональности.
  • В оконном менеджере Sawfish применяется специальный диалект Лиспа Rep, который в значительной степени повторяет диалект Лиспа от Emacs.
  • Диалект Scheme используется в качестве одного из скриптовых языков в графическом процессоре Gimp.

Сегодня Лисп используется во множестве различных проектов: от декодирования генома человека до системы проектирования авиалайнеров. Кроме традиционных научных и промышленных применений Лисп используется для высокодинамичных трёхмерных игр (диалект GOAL).

Большую системную и прикладную роль Лисп играет в Linux операционной системе Debian[Источник?].

Философия[править | править код]

Основной смысл Лисп-программы «жизнь» в символьном пространстве: перемещение, творчество, запоминание, создание новых миров и т. д. Лисп как метафора мозга, символ метафора сигнала [Источник?]:

Как происходит биологический анализ сигналов мозгом, как внешний фактор — физическое и химическое воздействие, являющееся для организма раздражителем превращается в биологически значимый сигнал, зачастую жизненно важный, определяющий все поведение человека или животного; и как происходит разделение разных сигналов на положительные, отрицательные и безразличные, индифферентные. Сигнал это уже интегративное понятие. Он представляет собой опознавательный знак группы, комплексных раздражителей, связанных между собой общей историей и причинно следственными отношениями. В этом комплексе, системе раздражителей, сигнальный стимул сам является также составляющим элементом и при иных обстоятельствах его роль может принадлежать другому стимулу из комплекса. В сигнале концентрируется весь прошлый опыт животного или человека. (Ю. Г. Кратин. «Анализ сигналов мозгом», 1975)

Идея[править | править код]

Periss icon.png Первоначальные исследования
Этот раздел статьи является первичным источником части изложенной в нём информации, содержа первоначальные (или ранее не известные широкому кругу читателей) исследования.

Основная идея и сила Лиспа — символьная обработка. Символьная обработка — один из двух базовых методов интеллектуальной работы компьютеры. Вход в символьное пространство позволяет заниматься задачами искусственного интеллекта: понимания окружающего мира и принятия решений. (Второй интеллектуальный метод — контининтуальная машина — нейросистема). Лисп настолько фундаментален, что достаточно иметь только Лисп, чтобы полноценно работать в области ИИ, и достаточно убрать Лисп, чтобы превратить работу в области ИИ в фарс (см. кретинизация). Вы будете смеяться, но нейросистемы также кретинизируются.

Компиляторы[править | править код]

BEE Lisp(Balabanov Eugene Embeddable Lisp) — это легковесный коммерческий компилятор для языка Lisp, разработанный Компанией «Симплтек Девелопмент». Компилятор позволяет создавать полностью автономные EXE и DLL файлы. В отличие от большинства аналогов, исполняемые файлы, созданные этим компилятором не требуют присутствия каких либо интерпретаторов или виртуальных машин. Его программный интерфейс для взаимодействия с ОС позволяет использовать DLL файлы, созданные сторонними разработчиками на других языках (таких как С++). Таким образом, можно вызывать как API функции Windows, так и API функции сторонних SDK из кода на языке Лисп. Можно смешивать Лисп код с кодом, созданным на компилируемых языках, таких как С++ и наоборот — можно вызывать лисп функции из С++ программ.

HomeLisp (HomeLisp - "домашний Лисп") - простая бесплатная Лисп-система, ориентированная на Windows. Поставляется вместе с простой IDE. Содержит в своем составе COM-библиотеку и два скриптовых движка, позволяющих писать скрипты на Лиспе, а также вызывать Лисп из любой среды, поддерживающей COM. Имеется поддержка графики. Реализована возможность построения автономных EXE-файлов в т.ч. и с графическим интерфейсом. Поддерживается сверхдлинная арифметика целых. Система снабжена подробной документацией.

См. также[править | править код]


Ссылки[править | править код]