Для чего джоном маккарти был создан язык программирования лисп
Для чего джоном маккарти был создан язык программирования лисп
Лисп (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!»:
А вы знаете, где сейчас используется Лисп?
Введение
Лисп — второй по старшинству из ныне живых высокоуровневых языков программирования (после Fortran) и первый функциональный язык. Он был разработан в 1958 году и сильно изменился с тех пор, породив множество диалектов и оказав значительное влияние на развитие других языков. На данный момент наиболее известные диалекты: Common Lisp, Scheme, Racket и Clojure.
Слева: Лисп-машина в музее MIT.
Справа: Лисп-машина Symbolics 3640, фото Michael L. Umbricht и Carl R. Friend (Retro-Computing Society of RI)
Лисп стал “первооткрывателем” многих идей, нашедших применение в современных языках программирования: древовидные структуры, динамическая типизация, функции высшего порядка и многое другое. В этом посте мы не будем углубляться во вклад Лиспа в теорию, а сосредоточимся на практической пользе.
Изначально Лисп предназначался для работ в области искусственного интеллекта, в частности как представление математической нотации для символьных вычислений. Но насколько широко диалекты Лиспа используются сейчас и в каких областях применяются?
Мы в Typeable любим и применяем функциональное программирование, а влияние Лиспа на функциональные языки всё ещё сильно, поэтому нам стало интересно разобраться в этом вопросе.
Кто и что пишет на Лиспе?
Во время учёбы мне часто приходилось иметь дело с диалектами Лиспа. Проведя поиск информации при подготовке этой статьи, я была приятно удивлена, когда находила упоминание кода на том или ином диалекте Лиспа в приложениях, которыми пользуюсь сама. Думаю, и вы найдёте знакомые названия в этом списке.
Заключение
Я попыталась включить в список примеры из разных прикладных областей, инструменты для разработчиков, готовые приложения для нетехнических пользователей и системы, входящие в состав того, чем регулярно пользуется довольно большое число людей, даже не задумываясь об этом.
Конечно, это список не полный, здесь выделены наиболее интересные на мой субъективный взгляд применения Лиспа в современном ПО. Более полные списки библиотек, готовых приложений и компаний, использующих диалекты Лиспа, можно посмотреть в следующих ресурсах:
Рассказывайте в комментариях, какие программы на Лиспах используете и делитесь своими pet-проектами!
Джон Маккарти Отец искусственного интеллекта, автор языка LISP
Отец искусственного интеллекта, автор языка LISP
LISP был для нас не просто языком, который используют для определенных целей, им можно было полюбоваться, как прелестной вещью. Поэтому существовала постоянная напряженность в отношениях между теми, кто восхищался LISPom за его чистоту, и теми, кто стремился использовать его для различных вычислений. Безусловно, с помощью LISPa проделано множество вычислений. Но в самом начале было не так. Часто говорили, что главная цель LISPa — делать больше LISPa.
Слова, вынесенные в эпиграф, принадлежат бывшему дипломнику Джона Маккарти в период разработки нового языка программирования. Для специалистов по информатике эти слова неудивительны, т. к. имя Джона Маккарти известно во всем мире. Его называют отцом искусственного интеллекта, он первый ввел термин «искусственный интеллект» и создал первый язык искусственного интеллекта.
Джон Маккарти сыграл решающую роль в основании двух самых известных научных центров США по исследованию проблем искусственного интеллекта — в Массачусетском университете в 1957 году и в Стэнфордском университете в 1963 году. Среди его многочисленных работ, внесших значительный вклад в науку, наиболее важные относятся к концу 50-х годов, когда он работал в Массачусетском Технологическом институте. Именно там в 1959 году Маккарти предложил концепцию разделения времени — режима работы компьютера, который позволяет нескольким программистам, работая за разными терминалами, одновременно использовать его память и процессор. Помимо всего прочего, это означало, что исследователи в области искусственного интеллекта получили возможность составлять и проверять экспериментальные программы непосредственно, не ожидая по нескольку часов и дней, пока их задания, заложенные среди других в пакеты перфокарт, будут обработаны единственным оператором вычислительной машины.
В 80-х годах главный научный интерес Джона Маккарти — это формализация так называемых «знаний здравого смысла».
Джон Маккарти родился 4 сентября 1927 года в Бостоне, штат Массачусетс, в семье профсоюзного деятеля-марксиста. Уже в возрасте 8 лет он твердо знал, что непременно будет ученым. Не имея возможности и опыта работы с компьютером, Маккарти интересовался техническими новинками и строил планы на будущие. В 1944 году Джон поступил в Калифорнийский технологический университет (Cal-Tech), но был отчислен за многочисленные пропуски по физкультуре, которая давалась ему с большим трудом. В 1945 году он был призван на службу в армию. После возвращения из армии Маккарти повторно зачислили в Калифорнийский технологический университет. Окончив его, Джон продолжил свое образование в Принстоне, где и получил степень доктора наук.
В начале 50-х годов Маккарти разделял взгляды коммунистов, а десятилетием позже стал радикалом с длинными волосами и лентой на лбу. В 70-е годы он взбирался на горы, летал на самолете и иногда, для разнообразия, прыгал с парашютом. 80-е годы Маккарти встретил одетым в строгий костюм и высказывающим столь же «строгие» консервативные взгляды. Одно в нем было неизменно, Маккарти был поистине генератором самых фантастических идей, которые он разбрасывал с такой скоростью, с какой вводил информацию в компьютер у себя дома или на работе. Один журналист описал его как «человека поразительной внешности, седовласого патриарха с бородкой обольстителя… и шокирующими манерами, например привычкой поворачиваться и уходить, оборвав разговор на полуслове».
Задолго до того, как разгорелись споры в области искусственного интеллекта, исследователям пришлось преодолеть ряд серьезных трудностей в применении компьютеров. При взаимодействии человека с компьютером наиболее важны два момента: во-первых, по возможности более легкий доступ к машинам, во-вторых, более совершенные языки программирования. В решение обеих задач в конце 50-х годов существенный вклад внес Джон Маккарти, именно он первым ввел термин «искусственный интеллект». В 1956 году Маккарти организовал Дартмутскую конференцию. Эта конференция объединила многих экспертов в области машинного интеллекта, которые и заложили основу для будущих исследований в области искусственного интеллекта, а именно так они назвали науку и практику создания интеллектуальных компьютерных программ. Маккарти был по праву назван отцом искусственного интеллекта.
В 1956–1959 годах Джон Маккарти вместе со студентами Массачусетского технологического института (МТИ) разработал новый изящный язык для работы со списками, которому и дал имя LISP. Причем многие студенты внесли существенный вклад в эту разработку. В частности, Д. Эдвардс запрограммировал процесс очистки памяти от ненужных массивов, так называемой сборки мусора (garbage collection), являющийся фундаментальным понятием в LISP, да и в других языках.
Название язык получил от сокращения английских слов LISP Processing (LISP), что означает «обработка списков».
Программы и данные LISP существуют в форме символьных выражений, которые хранятся в виде списковых структур. LISP имеет дело с двумя видами объектов: атомами и списками. Атомы — это символы, используемые для идентификации объектов, которые могут быть числовыми или символьными (понятия, материалы, люди и т. д.). Список — это последовательность из нуля или более элементов, заключенных в круглые скобки, каждый из которых является либо атомом, либо списком. LISP манипулирует списками путем использования трех примитивных функций: CAR, CDR и CONS, из которых получаются все другие функции обработки списков. В функции CAR в качестве значения аргумента используется первый элемент списка; значением аргумента в функции CDR является оставшаяся часть списка после удаления первого элемента, а функция CONS собирает вновь то, что CAR и CDR разбили на части. Интересно отметить, что слова «CAR» и «CDR» остались в LISP на память от первой реализации языка на ламповом компьютере IBM 704. Они являются сокращением английских слов, означающих «содержимое адресной части регистра» и «содержимое уменьшаемой части регистра», соответственно, терминами, характерными для машин первого поколения.
Во многих отношениях LISP отличается от других языков прежде всего тем, что выполнение программы не состоит в последовательности шагов, как в других языках. В основном LISP относится к языкам интерпретирующего типа, однако в некоторых его диалектах имеется функция COMPILE, которая может быть использована для компилирования LISP-npoграмм.
В 1962 году Джон Маккарти переехал в Стэнфорд. В этот период он решил первые проблемы в разделе математики, называемом семантикой вычислений. Маккарти уделял большое внимание проблемам общности. Он пишет: «Еще в 1958 году было очевидно, что системы искусственного интеллекта страдают отсутствием общности. Первый явный симптом состоит в том, что небольшое добавление к идее программы часто приводит к переписыванию заново всего начала со структурами данных». Некоторый прогресс был достигнут с появлением модульности структур данных, но по-прежнему невозможно было обходиться без переписывания программ. Другим симптомом, по мнению Маккарти, являлся тот факт, что никто не знал, как создать такую базу данных, содержащую общеполезные знания об окружающем мире, которую могла бы использовать любая программа, нуждающаяся в этих знаниях. В 1963 году Маккарти публикует статью, посвященную именно проблемам общности в системах искусственного интеллекта. В ней он выдвигает предположение, что, может быть, стоило бы попробовать что-нибудь более похожее на генетическую эволюцию, например, дублировать подпрограммы, одни копии модифицировать, а другие оставлять неизменными. Обучающаяся система экспериментировала бы: а не лучше ли заменить некоторые вызовы начальных подпрограмм вызовами модифицированных подпрограмм? Может быть, потребовалось бы зарезервировать для модификаций некоторое количество параметров подпрограмм. Однако все способы представления знаний с помощью программ сталкивались с возникновением такого вопроса, насколько скоро придется комбинировать несопоставимые знания или создавать программы, модифицирующие знания. Маккарти считал, что малые модификации поведения в большинстве случаев можно описать как малые изменения представлений о мире и для этого необходима система, точно отражающая эти представления.
Он писал: «Если вы хотите, чтобы машина могла выводить абстракции, скорее всего, это значит, что она должна уметь представлять эти абстракции некоторым достаточно простым способом».
Еще тогда возникла идея увеличения общности, которая заключается в том, чтобы воспользоваться логикой для такого описания фактов, которое не зависело бы от того, как эти факты будут использоваться впоследствии. Тогда Маккарти казалось (как, впрочем, и сейчас), что люди по объективным причинам предпочитают общаться с помощью декларативных предложений, а не языков программирования, все равно, является ли субъект общения человеком, существом с Альфа Центавра или компьютерной программой. Более того, и для внутреннего представления проявляются преимущества декларативной информации.
За любое увеличение выразительной силы, по мнению Маккарти, приходится платить требуемой сложностью программ, осуществляющих рассуждения и решающих задачи. Другими словами, ограничение выразительности декларативной информации позволяет упростить процедуру поиска. Одно из основных ограничений, которое обычно принимается, заключается в необходимом соблюдении следующего условия: при выведении новых фактов таковыми должны являться только формулы без переменных, т. е. рассуждения в высказываниях должны производиться с подстановкой вместо переменных константы. Оказывается, что повседневная жизнь человека по большей части сопровождается именно такими рассуждениями.
В это же время Маккарти вместе с Хэйесом занимался проблемами эпистемологических и эвристических аспектов задач искусственного интеллекта. Они предположили, что изучать проблемы общности гораздо проще в рамках эпистемологического подхода. Разница состоит в том, что при эпистемологическом подходе требуется полный набор фактов, гарантирующий, что некоторая стратегия достигает цели, в то время как эвристический подход предполагает поиск приемлемой стратегии исходя из наличных фактов.
Основная идея работы состояла в создании базы данных «здравого смысла» общего назначения. Информацию «здравого смысла», имеющуюся у людей, предполагалось записать в логической форме и включить в базу данных. Любая программа целенаправленного поиска могла бы обратиться к ней за фактами, необходимыми для того, чтобы решить, как достигнуть поставленной цели. Наиболее значимыми фактами базы данных должны были быть факты с результатами действий робота, пытающегося перемещать объекты с одного места на другое.
Джон Маккарти (80-е годы)
Изучение этой проблемы привело к созданию в 1960 году «исчисления ситуаций», целью которого было нахождение способа описания результатов действий вне зависимости от проблемной области. Однако ситуационное вычисление было применимо только в том случае, когда рассуждения о дискретных событиях, результатом каждого из которых является новая общая ситуация, имеют смысл. Непрерывные события и события, происходящие одновременно, теорией не охватывались. Оказалось, что, к сожалению, практически невозможно использовать ситуационное исчисление даже для довольно ограниченных задач. Использование универсальных программ для доказательства теорем приводило к слишком медленной работе программы, потому что в 1969 году программы для доказательства теорем не имели средств управления поиском. Все это привело к созданию системы STRIPS, в которой использовались только логические рассуждения в рамках конкретной ситуации. Формализм системы STRIPS был более ограниченным, чем исчисление ситуаций в полном объеме. Чтобы избежать противоречий, необходимо было аккуратно выбирать факты, входившие в число аксиом. Эти противоречия могли возникать при невозможности удалить высказывание, которое не являлось бы истинным в результате действия происшедшей ситуации.
Другим теоретическим достижением Джона Маккарти являлся метод ограничений для немонотонных рассуждений. Немонотонность значительно расширила возможности выражения универсальных знаний о результатах событий в ситуационном исчислении. Она также дала метод решения проблемы фрейма, которая, по мнению Маккарти, была еще одним препятствием для достижения общности.
В 1971 году Джон Маккарти был награжден премией Тьюринга за достижения в области искусственного интеллекта. Ныне он профессор информатики, профессор кафедры им. Шарля М. Пижо Инженерной школы Стэнфордского университета. Маккарти работает над новым языком программирования Elephant. Этот язык предназначен для программ, взаимодействующих с людьми или с программами, принадлежащими другим организациям. В настоящие время наиболее важный из его проектов заключается в формализации контекста и его приложений к искусственному интеллекту. Маккарти по праву можно назвать генератором идей, которые помогают приблизить компьютеры к более высокому уровню интеллекта. Только время покажет, верно ли его утверждение о возможности создания компьютера, более умного, чем человеческий мозг.
Читайте также
Создание искусственного шелка
Создание искусственного шелка Перечисленные выше свойства шелка усложняют его получение в искусственных условиях. Однако ввиду высокой стоимости и востребованности шелка со второй половины XIX века предпринимались настойчивые попытки его синтеза. Молекула шелка очень
Садовод со знанием французского языка. Преподаватель французского языка Алексей Петрович Гемилиан (1826–1897)
Садовод со знанием французского языка. Преподаватель французского языка Алексей Петрович Гемилиан (1826–1897) Н. Н. Бантыш-Каменский отмечал: «После чумы (1771 г.) на Москву напала другая зараза — французолюбие. Много французов и француженок наехало с разных сторон, и нет
Тайны интеллекта
Тайны интеллекта Как писал А.Блок, человеку в этом бренном мире доступны «и жар холодных числ, и дар божественных видений», свойственны способность глубокого интеллектуального проникновения в суть загадочного бытия и прекрасные эмоциональные взлеты.Интеллект Ленина,
Автор языка – Бог?
Автор языка – Бог? Язык был создан Богом, богами или божественными мудрецами – эта гипотеза отражена в религиях разных народов.Древние индийские Веды рисуют этот процесс так: главный бог дал имена другим богам, а имена вещам дали святые мудрецы при помощи главного
ВЫСТУПЛЕНИЕ СЕНАТОРА МАККАРТИ
ВЫСТУПЛЕНИЕ СЕНАТОРА МАККАРТИ «Холодная война» с СССР не могла не оказать влияние на идеологию внутри самих США. Борьба с коммунизмом, происходившая во внешней политике, отразилась и на внутренней политике государства. Антикоммунистическая истерия развивалась тем
Возникновение искусственного орошения
Возникновение искусственного орошения Таким образом, первоначальное земледелие скорее всего возникло в предгорных зонах, где выпадает необходимое для примитивного земледелия количество осадков. Дождевая влага могла быть использована человеком сначала при посевах
При блеске искусственного дня
При блеске искусственного дня Парадная лестница — это визитная карточка хозяев дома. Она представляет их обществу. Соответствующим образом оформленная, она сообщает о богатстве и достоинстве хозяев. В старых особняках, сохранившихся до наших дней, парадные лестницы
Книга от Маккарти
Книга от Маккарти Тысячи украинских сторонников нацистов после Второй мировой войны перебрались в США. В период маккартизма они признавались жертвами «коммунистического варварства». Ими был вновь изобретен миф о голоде-геноциде, изданный двухтомной книгой «Черные
Джон БЭКУС Создатель языка FORTRAN
Джон БЭКУС Создатель языка FORTRAN Вероятно, здесь нет никого, кто не слышал бы о FORTRANe, и большинство из вас, вероятно, использовали его хотя бы однажды, или, по крайней мере, вы наблюдали за человеком, пишущим программу на FORTRANe, вероятно, большинству знакомо сокращение «БНФ», но
Джон Кемени и Томас Курц Создатели популярного языка BASIC
Джон Кемени и Томас Курц Создатели популярного языка BASIC В прошлом веке один английский миссионер, желая приобщить туземцев к цивилизации, выделил из английского языка самую распространенную и самую простую его часть и стал учить туземцев такому упрошенному
Алан Кэй Автор объектно-ориентированного языка SmallTalk и многооконного интерфейса
Алан Кэй Автор объектно-ориентированного языка SmallTalk и многооконного интерфейса Лучший способ предсказать будущее — изобрести его. Aлaн Кэй Алан КэйНебольшие аккуратные усы и немного взлохмаченные темные волосы… Кроссовки и вельветовые брюки… Алану Кэю не подходит
Сеймур Пейперт Теоретик компьютерного образования и автор языка LOGO
Сеймур Пейперт Теоретик компьютерного образования и автор языка LOGO …я начал думать о создании языка программирования, который мог бы быть доступен детям. Это не значит, что такой язык должен быть чем-то вроде игрушки. Напротив, я хотел разработать мощный язык
Марвин Минский Патриарх искусственного интеллекта
Марвин Минский Патриарх искусственного интеллекта Я верю, что это так, что мы находимся на пороге эпохи, в которой будут играть большую, а может, и доминирующую роль машины, решающие интеллектуальные проблемы. Марвин Минский Марвин МинскийЕго исследования привели к
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 и определении собственных функций. Позже — рекурсия, управляющие структуры, область действия, ввод-вывод. Еще позже — если не надоем — о функционалах, макросах, свойствах символов и замыканиях. Ну и конечно, о том, о чем попросит общественность.
До встречи!