Семантика и синтаксис Язык Lisp. Особенности. Модель интерпретатора. Символьное программирование. Философия разработки. Eugeny L. Yakimovitch http://desk.by/~ewger 2008 John McCarthy Пионер в ИИ Formalize common-sense reasoning Также Разделение времени Ситуационное исчисление Предельная немонотонная логика …. Lisp возник из интереса к символьному вычислению http://www-formal.stanford.edu/jmc/ (математика, логика) Lisp - язык (не только) функционального программирования Язык ЛИСП (LISP) был разработан в 1958 году американским ученым Джоном Маккарти как функциональный язык, предназначенный для обработки списков. (LISt Processing). Lisp - означает "лепетать". С появлением этого языка машина стала пока лепетать, a не говорить по-человечески. В основу языка положен серьезный математический аппарат: лямбда-исчисление Черча алгебра списочных структур теория рекурсивных функций Долгое время язык использовался узким кругом исследователей. Широкое распространение язык получил в конце 70-х - начале 80-х годов с появлением необходимой мощности вычислительных машин и соответствующего круга задач. В настоящем - Лисп одно из главных инструментальных средств систем искусственного интеллекта. Он принят как один из двух основных ЯП для министерства обороны США и постепенно вытесняет второй ЯП - АДА. Система AutoCAD разработана на Лиспе. Lisp - язык (не только) функционального программирования Как правило, реализуется как интерпретатор Символьный безтиповый язык – символы не привязаны к какому-то типу по умолчанию Использует макросы, что делает его эффективным языком для метапрограммирвоания Поддерживает итерационное, объектное, списковое, модульное, процедурное, рефлексивное программирование Диалекты Lisp Common Lisp Scheme AutoLisp Scheme Aвторы языка Scheme — Гай Стил (Guy L. Steele) и Джеральд Сассмен (Gerald Jay Sussman) из Массачусетского технологического института — создали его в середине 1970х годов. Минималистская философия. Новые возможности надстраиваются по мере необходимости. Например, 2 механизма организации циклов : 1. «остаточная» или «хвостовая» рекурсия (англ. tail recursion) 2. итеративный подход (в котором используются временные переменные для сохранения промежуточного результата. AutoLisp Небольшой язык, с динамической областью видимости. Отсутствуют такие элементы CL как макросы и замыкания. Используется с системах инженерной графики и автоматического проектирования. Синтаксис Вопрос: насколько эффективный язык программирования можно построить на основании следующего синтаксиса: ( )? S-выражения Основу ЛИСПа составляют символьные выражения, которые называются S-выражениями и образуют область определения для функциональных программ. S-выражение (Simbolic expresion) - основная структура данных в ЛИСПе. (ДЖОН СМИТ 33 ГОДА) ((МАША 21) (ВАСЯ 24) (ПЕТЯ 1)) ; S-ВЫРАЖЕНИЯ ; S-ВЫРАЖЕНИЯ S-выражение - это либо атом, либо список. Атомы Атомы - это простейшие объекты Лиспа, из которых строятся остальные структуры. Атомы бывают двух типов - символьные и числовые. Символьные атомы - последовательность букв и цифр, при этом должен быть по крайней мере один символ отличающий его от числа. ДЖОН АВ13 В54 10А Символьные атомы Символьный атом или символ - это не идентификатор переменой в обычном языке программирования. Символ как правило обозначает какой либо предмет, объект, вещь, действие. Символьный атом рассматривается как неделимое целое. К символьным атомам применяется только одна операция: cравнение. В CL в состав символа могут входить: + - * / @ $ % ^ _ \ <> Числовые атомы Атом (число или список) суть простейшее S-выражение. Числовые атомы - обыкновенные числа 124 -344 4.5 3.055Е8 Числа это константы. Типы чисел зависят от реализации ЛИСПа Списки В ЛИСПЕ список это последовательность элементов (list 1 2 3 4). Элементами являются или атомы или списки. Списки заключаются в скобки, элементы списка разделяются пробелами. Примеры списков (банан) 1 атом (б а н а н) 5 атомов (a b (c d) e) 4 элемента Таким образом список - это многоуровневая или иерархическая структура данных, в которой открывающиеся и закрывающиеся скобки находятся в строгом соответствии. (+ 2 3) 3 атома (((((первый) 2) второй) 4) 5) 2 элемента Пустой список Список, в котором нет ни одного элемента, называется пустым списком и обозначается "()" или символом NIL. NIL - это и список и атом одновременно. Пустой список играет такую же важную роль в работе со списками, что и ноль в арифметике. Пустой список может быть элементом других списков. (NIL) ;список состоящий из атома NIL (()) ;то же самое, что и (NIL) ((())) ;- " -((NIL)) (NIL ()) ;список из двух других списков Логические константы NIL обозначает кроме этого, в логических выражениях логическую константу "ложь" (false). Логическое "да"(true) задается символом "Т". Атомы и списки - это символьные выражения или S-выражения. Диаграмма символьных выражений S-Выражения Логические константы Атомы Символы Числа T Списки NIL NIL обозначает кроме этого, в логических выражениях логическую константу "ложь" (false). Логическое "да"(true) задается символом "Т". Атомы и списки - это символьные выражения или S-выражения. Соотношение рассмотренных основных типов ЛИСПА поясняет диаграмма. Модель ЯП Можно выделить следующие уровни ЯП: Абстрактный : сложность формализации решаемой задачи Информационный : семантическая интерпретация выполняемого вычисления Уровень Взаимодействия : логические и функциональные отношения между объектами вычисления, и их комбинации Уровень Представления : символьный или численный способ представления данных в виде промежуточных трансляций или кода Диалог с интерпретатором Лиспа REPL = Read->Eval->Print->Loop Loop {read; eval; print;} Loop (print(eval(read()))) Философия разработки Все может быть сделано из командной строки интерпретатора. Идеология Lisp во многом определила последующее развитие ОС и ЯП. Создание программ REPL или ED Функции отладки TRACE, STEP, DEBUG, BREAK, ERROR Компиляция и выполнение COMPILE, COMPILE-FILE Документация DOCUMENTATION, DESCRIBE, APROPOS, TIME Пример трассировки функции 1) 2) 3) 4) CL-USER> (trace +) WARNING: TRACE: redefining function + in top-level, was defined in C ;; Tracing function +. (+) Пример трассировки функции CL-USER> (+ (+ 1 2) 3) 2) 1. Trace: (+ '1 '2) 3) 1. Trace: + ==> 3 4) 1. Trace: (+ '3 '3) 5) 1. Trace: + ==> 6 6) 6 1) Пример трассировки функции 1) 2) 3) 4) 5) 6) CL-USER> (+ 3 (+ 1 2)) 1. Trace: (+ '1 '2) 1. Trace: + ==> 3 1. Trace: (+ '3 '3) 1. Trace: + ==> 6 6 Практика хорошего Lisp программирования Запрет на использование глобальных переменных и создания функций с побочным эффектом Мнемоническое обозначение символов (переменных, функций, макросов, объектов..) Разбиение проекта на секции кода по отдельным файлам. Объявление кода внутри замыканий LET и пакетов PACKAGES. Использование систем. (cl-irc:read-message (cl-irc:connection))