Lisp. Cемантика и синтаксис

advertisement
Семантика и
синтаксис
Язык 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))
Download