Лисп

Лисп
Семантика: мультипарадигменный: объектно-ориентированное, функциональное, процедурное программирование
Тип исполнения: {{{class}}}
Появился в: 1958 г.
Автор(ы): Джон Маккарти
Типизация данных: cтрогая, динамическая
Основные реализации:
Диалекты: Common Lisp, Scheme, Emacs lisp
Создан под влиянием: не известно
Оказал влияние на: Лого, Smalltalk, Scheme, CLOS

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

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

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

Одним из самых распространенных диалектов Лиспа является Common Lisp. Его реализации существуют для большинства платформ. Есть реализации распространяемые свободно под лицензиями, позволяющими использовать Лисп без ограничений в коммерческих приложениях, кроме этого существуют коммерческие реализации, предлагающие дополнительные возможности (IDE,дополнительные библиотеки и т. п.), в том числе техническую поддержку. С полным списком реализаций можно ознакомиться здесь: http://www.cliki.net/Common%20Lisp%20implementation.

Содержание

Синтаксис

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

Список является последовательностью элементов любого рода, в том числе других списков. Например, (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»).

Примеры

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

((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))))

Применение

Лисп используется как язык сценариев в САПР AutoCAD и текстовом редакторе Emacs. По сути, большая часть Emacs написана на Лиспе, что даёт неограниченные возможности расширения функциональности. В оконном менеджере Sawfish применяется диалект Лиспа Rep, который в значительной степени повторяет диалект Лиспа от Emacs. Sawfish, как и Emacs распространяется на правах GNU GPL. Сегодня Лисп используется во множестве различных проектов: от декодирования генома человека до системы проектирования авиалайнеров. Кроме традиционных научных и промышленных применений Лисп используется для высокодинамичных трехмерных игр (диалект GOAL). Ознакомиться с областями использования Common Lisp можно по адресу http://www.franz.com/success/.

Ссылки



 
Начальная страница  » 
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 Home