В честь кого назван язык программирования lisp

Содержание
  1. В честь кого назван язык программирования lisp
  2. Содержание
  3. Синтаксис
  4. Примеры
  5. LISP. Атом первый
  6. Краткая история
  7. Типы данных
  8. Крылья, ноги… Главное хвост
  9. Основные функции и предикаты
  10. Функция QUOTE
  11. Функция CAR
  12. Фунция CDR
  13. Функция CONS
  14. Функция ATOM
  15. Функция EQ
  16. Функция NULL
  17. Что дальше?
  18. СОДЕРЖАНИЕ
  19. История
  20. График
  21. Подключение к искусственному интеллекту
  22. Генеалогия и варианты
  23. Исторически значимые диалекты
  24. 2000, чтобы представить
  25. Основные диалекты
  26. Стандартизированные диалекты
  27. Языковые инновации
  28. Синтаксис и семантика
  29. Символьные выражения (S-выражения)
  30. Списки
  31. Операторы
  32. Лямбда-выражения и определение функции
  33. Атомы
  34. Консультации и списки
  35. S-выражения представляют собой списки
  36. Процедуры обработки списков
  37. Общая структура
  38. Формы самооценки и цитирование
  39. Объем и закрытие
  40. Списочная структура программного кода; использование макросами и компиляторами
  41. Оценка и цикл чтения – оценки – печати
  42. Структуры управления
  43. Примеры
  44. Системы объектов

В честь кого назван язык программирования lisp

Лисп (LISP, от англ. LISt Processing language — «язык обработки списков»; современное написание: Lisp) — семейство языков программирования, программы и данные в которых представляются системами линейных списков символов. Лисп является вторым в истории (после Фортрана) используемым по сей день высокоуровневым языком программирования. Создатель Лиспа Джон Маккарти занимался исследованиями в области искусственного интеллекта (в дальнейшем ИИ) и созданный им язык по сию пору является одним из основных средств моделирования различных аспектов ИИ.

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

Язык Лисп, наряду с языком Ada, прошел процесс фундаментальной стандартизации для использования в военном деле и промышленности, в результате чего появился стандарт Common Lisp. Его реализации существуют для большинства платформ.

Одной из базовых идей языка Lisp является представление каждого символа как узла многокоординатной символьной сети; при этом координаты, свойства, уровни сети записаны в так называемых слотах символа. Основные слоты:

Язык Лисп является языком системного программирования для так называемых Лисп-машин, производившихся в 80-е годы, например, фирмой Symbolics.

Содержание

Синтаксис

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

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

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

s_expression ::= atomic_symbol | «(» s_expression «.» s_expression «)» | list

atomic_symbol ::= letter atom_part

atom_part ::= empty | letter atom_part | number atom_part

Примеры

Пример программы, выводящей сообщение «Hello, world!»:

Источник

LISP. Атом первый

Привет, Хабр!
LISP заинтересовал меня уже давно, но, к сожалению, активно использовать свои знания и стремления на практике шанса не было. Скоро новый учебный год, а значит у меня опять будет возможность изучать и, уже второй год, преподавать студентам LISP. Еще одной проблемой, кроме традиционного отсутствия интереса к сложным вещам, кажется отсутствие литературы. Да и вообще, тема LISP-а в интернете, а тем более в рунете освещена слабо. Вот и на Хабре публикаций довольно мало.

Надеюсь, эта статья понравится общественности и откроет серию, повествующую об одном из наиболее интересных и наименее понятных (хотя до brainfuck и далеко) языков программирования – LISP. Ведь, как это не банально, еще один язык — еще одна жизнь

Начнем с базовых понятий LISP-а – атомов и списков. Немного позже, если будет интересно, в приквеле «Атоме нулевом» можно будет более подробно поговорить о философии и причинах возникновения LISP, а так же о современных направлениях его использования.

Краткая история

LISP был придуман Джоном Маккарти в 1958 году для решения задач нечислового характера и базировался на трех основных китах: алгебре списочных структур, лямбда исчислении, теории рекурсивных функций. Долгое время LISP использовался исключительно узким кругом специалистов по искусственному интеллекту. Но, начиная с 80-х годов прошлого века, LISP начал набирать обороты и сейчас активно используется, например, в AutoCad и Emacs.

Типы данных

Традиционно в LISP рассматривают два типа атомов: символы и числа. Символы могут обозначать числа, строки, сложные структуры, функции и другие объекты. Ограничения на имена символов зависят от используемого диалекта, но большинство из них не накладывает практически никаких ограничений на используемые в именах символы. Кроме того, опять же в большинстве диалектов, имена символов не зависят от регистра.
Некоторые символы имеют специальное назначение – это константы, встроенные функции, T (true, истина) и NIL (false, ложь).

Читайте также:  Английский язык как выучить быстро за месяц

Числа, в отличии от символов, не могут представлять другие объекты, таким образом число всегда является константным числом. Немного позже мы рассмотрим типы чисел в LISP.
Символы и числа представляют собой наиболее простые объекты LISP – атомы. Второй основной тип данных – точечные пары, которые синтаксически выражаются следующим образом:

Например, точечными парами являются выражения:

Атомы и точечные пары объединяют под общим названием S-выражения (S-expression, symbolic expression). Особым видом S-выражения является список, выражаемый следующим образом:

NIL в большинстве случаев определяется как пустой список, в таком случае определение списка можно переписать следующим образом:

Крылья, ноги… Главное хвост

И голова и хвост являются ключевыми понятиями в списочном контексте LISP. Первый элемент списка именуется головой списка, все остальные элементы – хвостом. Для работы с головой и хвостом существует набор базовых функций, рассмотренный немного ниже.
Пустой список эквивалентен паре пустых скобок:
NIL ().
Непустой список, состоящий из элементов a1, a2, a3… в соответствии с правилами записи S-выражений может быть записан следующим образом:

В LISP список можно записать и последовательностью элементов, заключенных в скобки и разделенных пробелами. По большему счету, список – это многоуровневая структура данных, для которой архиважна последовательность открывающих и закрывающих скобок.
Элементами списка могут быть атомы и списки, в том числе и пустой список. Например, () – пустой список, а (NIL) – список, состоящий из одного элемента NIL – что эквивалентно (()).
Следует понимать, что обычный синтаксис S-выражений может использоваться наравне со списочным синтаксисом, например, следующие выражение эквивалентны:

(a.(b.nil)), (a b.nil), (a b nil), (a b)

Если кому-нибудь интересно – можно будет рассказать и о внутреннем представлении списков в памяти. Это вполне самостоятельная и по интересу и по объему тема.

Основные функции и предикаты

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

Традиционном к базовым функциям относят QUOTE, CAR, CDR, CONS, ATOM, EQ.

Функция QUOTE

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

Функцию QUOTE можно записать и короче:

Функция CAR

Предназначена для получения первого элемента точечной пары (или же головы списка). Использование данной функции возможно лишь в списочном контексте, использование для атома приведет к ошибке.

Для удобство головой пустого списка считается NIL.

Фунция CDR

Предназначена для получения второго элемента точечной пары (или же хвоста списка). Использование данной функции возможно лишь в списочном контексте, использование для атома приведет к ошибке.

Хвостом списка является весь список без первого элемента. Если список состоит из одного элемента, хвостом будет NIL. Хвостом пустого списка для удобства так же считается nil.
Несколько примеров:

Функции CAR и CDR реализованы во всех диалектах LISP, но в некоторых для них созданы и синонимы: FIRST и REST, HEAD и TAIL).

Функция CONS

Фактически функция CONS является антиподом функций CAR и CDR:

Функция ATOM

ATOM и EQ являются предикатами – т.е. функциями, проверяющих соответствие аргумента некоторому свойству и возвращающими T или NIL в зависимости от успешности проверки.

Предикат ATOM проверяет, является ли объект, переданный в качестве аргумента, атомом:

atom (S-выражение)

Функция EQ

Предикат, проверяющий идентичность двух символов.

eq (атом, атом)

Следует помнить, что предикат EQ применим лишь к атомарным аргументам и не может быть использован для списков. Так же не следует использовать EQ при сравнении чисел.

Более общим по сравнению с EQ является предикат EQL, позволяющий сравнивать однотипный числа:

Еще более общим для чисел является предикат =, позволяющий сравнивать значения чисел различных типов:

Более общим для списков является предикат EQUAL, позволяющий сравнивать идентичность двух списков:

Наиболее общим предикатом является EQUALP, позволяющий сравнивать произвольные объекты.

Функция NULL

NULL проверяет, является ли объект, переданный в качестве аргумента, пустым списком:

Судя по двум последним примером, можно сделать вывод, что функцию NULL можно использовать и как логическое отрицание. Для этих же целей в LISP существует и предикат NOT.

Что дальше?

Надеюсь, что смог заинтересовать. В следующий раз я планирую рассказать о существующих диалектах LISP (хотя на первых порах достаточно будет университетского XLisp), менее часто используемых базовых функциях, сворачивании CAR и CDR в что-то вроде CAAAADDAAR и определении собственных функций. Позже — рекурсия, управляющие структуры, область действия, ввод-вывод. Еще позже — если не надоем — о функционалах, макросах, свойствах символов и замыканиях. Ну и конечно, о том, о чем попросит общественность.
До встречи!

Источник

СОДЕРЖАНИЕ

История

Джон Маккарти разработал Lisp в 1958 году, когда он работал в Массачусетском технологическом институте (MIT). Маккарти опубликовал свой дизайн в статье в « Коммуникациях ACM» в 1960 году, озаглавленной «Рекурсивные функции символьных выражений и их машинное вычисление, часть I». Он показал, что с помощью нескольких простых операторов и обозначений для анонимных функций, заимствованных у Черча, можно построить полный по Тьюрингу язык для алгоритмов.

Читайте также:  В русском языке зсп как делать

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

Первый полный компилятор Лиспа, написанный на Лиспе, был реализован в 1962 году Тимом Хартом и Майком Левиным из Массачусетского технологического института. Этот компилятор представил Lisp-модель инкрементной компиляции, в которой скомпилированные и интерпретируемые функции могут свободно смешиваться. Язык, использованный в записке Харта и Левина, намного ближе к современному стилю Лиспа, чем к более раннему коду Маккарти.

График

Хронология диалектов Лиспа ( править )
1955 г. 1960 г. 1965 г. 1970 г. 1975 г. 1980 г. 1985 г. 1990 г. 1995 г. 2000 г. 2005 г. 2010 г. 2015 г. 2020 г.
LISP 1, 1.5, LISP 2 (заброшен)
Маклисп
Интерлисп
Лисп-машина Лисп
Схема R5RS R6RS R7RS маленький
Ноль
Ференц Лисп
Common Lisp
Le Lisp
Т
Chez Scheme
Emacs Lisp
AutoLISP
ПикоЛисп
EuLisp
ISLISP
OpenLisp
Схема PLT Ракетка
GNU Guile
Визуальный LISP
Clojure
Дуга
LFE
Hy

Подключение к искусственному интеллекту

Генеалогия и варианты

Исторически значимые диалекты

2000, чтобы представить

Многие начинающие программисты Lisp были вдохновлены такими писателями, как Пол Грэм и Эрик С. Реймонд, на разработку языка, который другие считали устаревшим. Программисты-новички в Lisp часто описывают язык как открывающий им глаза опыт и заявляют, что он значительно более продуктивен, чем на других языках. Этот рост осведомленности можно сравнить с « зимой искусственного интеллекта » и кратковременным успехом Lisp в середине 1990-х.

Пятьдесят лет Lisp (1958–2008) отмечалось на LISP50 @ OOPSLA. Регулярно проводятся встречи местных пользователей в Бостоне, Ванкувере и Гамбурге. Другие мероприятия включают Европейскую встречу по Лиспу, Европейский симпозиум по Лиспу и Международную конференцию по Лисп.

Основные диалекты

Common Lisp и Scheme представляют два основных потока разработки Lisp. Эти языки воплощают в себе существенно разные варианты дизайна.

Стандартизированные диалекты

Языковые инновации

Эдсгер В. Дейкстра в своей лекции по Премии Тьюринга 1972 года сказал:

«Имея в основе несколько очень простых принципов, он [LISP] продемонстрировал замечательную стабильность. Кроме того, LISP был носителем значительного числа в некотором смысле наших самых сложных компьютерных приложений. LISP в шутку был описан как« самый разумный способ злоупотребления компьютером ». Я считаю это описание отличным комплиментом, потому что оно передает весь аромат освобождения: оно помогло ряду наших самых одаренных собратьев в размышлениях о ранее невозможных мыслях».

Синтаксис и семантика

Символьные выражения (S-выражения)

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

Списки

Операторы

Аналогично обрабатываются арифметические операторы. Выражение

принимает значение 10. Эквивалент в инфиксной записи будет » «. 1 + 2 + 3 + 4

«Специальные операторы» (иногда называемые «специальными формами») обеспечивают структуру управления Лиспа. Например, специальный оператор if принимает три аргумента. Если первый аргумент не равен нулю, он оценивает второй аргумент; в противном случае вычисляется третий аргумент. Таким образом, выражение

Лямбда-выражения и определение функции

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

( defun f ( a ) b. ) определяет новую функцию, названную f в глобальной среде. Концептуально оно похоже на выражение:

Атомы

Существенная разница между атомами и списками заключалась в том, что атомы неизменны и уникальны. Два атома, которые появлялись в разных местах исходного кода, но были написаны точно так же, представляли один и тот же объект, тогда как каждый список был отдельным объектом, который можно было изменять независимо от других списков и отличать от других списков с помощью операторов сравнения.

Консультации и списки

Поскольку conses и списки настолько универсальны в системах Lisp, распространено заблуждение, что они являются единственными структурами данных Lisp. Фактически, все лиспы, кроме самых упрощенных, имеют другие структуры данных, такие как векторы ( массивы ), хеш-таблицы, структуры и так далее.

S-выражения представляют собой списки

Процедуры обработки списков

Lisp предоставляет множество встроенных процедур для доступа к спискам и управления ими. Списки могут быть созданы непосредственно с помощью list процедуры, которая принимает любое количество аргументов и возвращает список этих аргументов.

Общая структура

Списки Lisp, будучи простыми связными списками, могут иметь общую структуру друг с другом. Другими словами, два списка могут иметь один и тот же хвост или конечную последовательность ответвлений. Например, после выполнения следующего кода Common Lisp:

Читайте также:  Английский язык перевести в прошедшее время

списки foo и bar являются и соответственно. Однако хвост в обоих списках имеет одинаковую структуру. Это не копия; cons-ячейки, указывающие на и находящиеся в одних и тех же ячейках памяти для обоих списков. ( a b c ) ( x b c ) ( b c ) b c

Поклонники функционального программирования избегают деструктивных функций. В диалекте Scheme, который отдает предпочтение функциональному стилю, имена деструктивных функций помечаются предупреждающим восклицательным знаком, или «взрывом», например set-car! (читай: набор автомобилей ), который заменяет автомобиль из минусов. В диалекте Common Lisp деструктивные функции являются обычным явлением; эквивалент set-car! назван rplaca для «заменить автомобиль». Однако эта функция встречается редко, поскольку Common Lisp включает специальное средство, setf упрощающее определение и использование деструктивных функций. Часто в Common Lisp используется стиль написания кода функционально (без деструктивных вызовов) при создании прототипа, а затем добавление деструктивных вызовов в качестве оптимизации там, где это безопасно.

Формы самооценки и цитирование

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

Изменение такой формы в кавычках обычно считается плохим стилем и определяется ANSI Common Lisp как ошибочное (приводящее к «неопределенному» поведению в скомпилированных файлах, потому что компилятор файла может объединять похожие константы, помещать их в защищенную от записи память, так далее.).

Объем и закрытие

Списочная структура программного кода; использование макросами и компиляторами

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

Эта функция упрощает разработку эффективных языков внутри языков. Например, объектная система Common Lisp может быть реализована чисто как расширение языка с использованием макросов. Это означает, что если приложению нужен другой механизм наследования, оно может использовать другую объектную систему. Это резко контрастирует с большинством других языков; например, Java не поддерживает множественное наследование, и нет разумного способа его добавить.

Макросы раскрываются перед этапом компиляции и, таким образом, предлагают некоторые интересные варианты. Если программе требуется предварительно вычисленная таблица, то макрос может создать таблицу во время компиляции, поэтому компилятору нужно только вывести таблицу и не нужно вызывать код для создания таблицы во время выполнения. В некоторых реализациях Лиспа даже есть механизм, eval-when который позволяет коду присутствовать во время компиляции (когда это может понадобиться макросу), но не присутствует в испускаемом модуле.

Оценка и цикл чтения – оценки – печати

Основная работа REPL заключается в следующем. Это упрощенное описание, в котором отсутствуют многие элементы реального Лиспа, такие как цитирование и макросы.

Обратите внимание, что a foo будет читаться как один символ. 123 будет читаться как число сто двадцать три. «123» будет читаться как строка «123».

Символ foo оценивается как значение символа foo. Такие данные, как строка «123», оцениваются как одна и та же строка. Список оценивается как список (1 2 3). ( quote ( 1 2 3 ))

Lisp REPL обычно также обеспечивает редактирование ввода, историю ввода, обработку ошибок и интерфейс для отладчика.

Структуры управления

Изначально в Лиспе было очень мало управляющих структур, но в процессе развития языка было добавлено гораздо больше. (Исходный условный оператор Лиспа cond является предшественником более поздних if-then-else структур.)

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

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

Примеры

Вот примеры кода Common Lisp.

Синтаксис Лиспа естественно поддается рекурсии. Математические задачи, такие как перечисление рекурсивно определенных множеств, легко выразить в этой нотации. Например, чтобы оценить факториал числа :

Альтернативная реализация занимает меньше места в стеке, чем предыдущая версия, если базовая система Lisp оптимизирует хвостовую рекурсию :

Следующая функция переворачивает список. (Встроенная обратная функция Lisp делает то же самое.)

Системы объектов

Различные объектные системы и модели были построены поверх, параллельно или в Lisp, в том числе:

Источник

Мастерица