Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Введение в программирование на Лиспе. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
1 Мб
Скачать

Л. В. Городняя, Н. А. Березин

Введение в программирование на Лиспе

Учебное пособие

4-е издание стереотипное электронное

Интернет-Университет

Ай Пи Ар Медиа

Информационных Технологий

 

www.intuit.ru

 

Москва

2025

УДК 004.42

ББК 32.97

Городняя, Л. В.

Введение в программирование на Лиспе : учебное пособие / Л. В. Городняя,

Н. А. Березин. — 4-е изд., стер. электрон. — Москва : Национальный Открытый Университет «ИНТУИТ» : Ай Пи Ар Медиа, 2025. — 134 с. — Текст : электронный.

ISBN 978-5-4497-0887-8

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

Знакомство с Лиспом — важная составляющая современного образования в области информатики. Лисп является ключом для изучения типовых задач системного программирования и искусственного интеллекта.

Учебное электронное издание

Технический редактор М.В. Половникова

Обложка С.С. Сизиумова, Я.А. Кирсанов

©ООО «ИНТУИТ.РУ», 2007–2016

©Городняя Л. В., Березин Н. А., 2007–2016

©Оформление электронного издания.

ООО Компания «Ай Пи Ар Медиа», 2021

Л.В. Городняя, Н.А. Березин

Введение в программирование на Лиспе

Содержание

1.

Рекурсивные функции и структуры данных

4

2.

Работа с Лисп-системой

13

3.

Списки и атомы

23

4.

Запись Лисп-программ

38

5.

Определение языка программирования

52

6.

Интерпретатор

65

7.

Отображения и функционалы

75

8.

Имена и контексты

90

9.

Оперирование вычислениями

103

10. Свойства атомов и работа с памятью

108

11. Стандартное программирование

116

12. Расширения и приложения Лиспа

125

Список литературы

134

3

Л.В. Городняя, Н.А. Березин

Введение в программирование на Лиспе

Рекурсивные функции и структуры данных

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

Автор языка Лисп – профессор математики и философии Джон МакКарти, выдающийся ученый в области искусственного интеллекта. Он предложил проект языка Лисп, идеи которого возбудили не утихающие до наших дней дискуссии о сущности программирования. Сформулированная Джоном Мак-Каpти (1958) концепция символьной обработки информации восходит к идеям Чёрча и других видных математиков конца 20-ых годов предыдущего века. Выбирая лямбдаисчисление как основную модель, Мак-Карти предложил функции рассматривать как общее понятие, к которому могут быть сведены все другие понятия программирования [1].

Для работы с данным курсом можно воспользоваться комплектом GNU Clisp, на базе которого подготовлены примеры курса, выставленным на сайте ссылка: http://green.iis.nsk.su/lisp

Определение 1.1

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

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

Алгоритм (поиск наибольшего общего делителя). Таблица (сложение или умножение для целых чисел). Процесс (взвешивание или измерение).

Устройство (вольтметр, термометр, часы)

Формализованный текст (процедура, подпрограмма, макрос и т.п.).

4

Л.В. Городняя, Н.А. Березин

Введение в программирование на Лиспе

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

Определение 1.2

Вычисление – процесс решения задачи, сводимой к обработке чисел, кодов или символов, рассматриваемых как модели реальных объектов.

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

Список – основная структура данных языка Лисп. Список может быть пустым или содержать произвольное число объектов любой природы. Пустой список используется в качестве истинностного значения, "ложь" - все остальное "истина".

Определение1.3

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

Кроме списков в языке Лисп имеются более общие структуры данных – символьные выражения (S-выражения), реализуемые как двоичные деревья, а Лисп-системы поддерживают обработку различных специальных структур данных, таких как вектора, массивы, строки, хэштаблицы, файлы, потоки ввода-вывода и др.

Определение 1.4

Двоичное дерево – это ориентированный граф, из каждой вершины которого выходит не более двух дуг.

Элементарные данные языка Лисп называются атомами. Атомы могут иметь вид имен, чисел или других объектов, неделимых базовыми

5

Л.В. Городняя, Н.А. Березин

Введение в программирование на Лиспе

средствами языка.

Атомы, выглядящие как имена, могут обладать свойствами, задаваемыми системой или программой. Значения переменных и определения функций – примеры свойств. Особый интерес представляют рекурсивные функции и методы их реализации в системах программирования.

Определение 1.5

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

Система программирования может быть задана как правило интерпретации или компиляции программ.

Определение 1.6

Система программирования – это комплекс средств и методов, используемых при подготовке и применении программ на одном или нескольких языках программирования.

Список из функции и перечня ее аргументов называется "форма" - синоним термина "выражение". Программа – это последовательность вычисляемых форм. Рекурсия – сведение к себе – позволяет такие правила записывать достаточно лаконично и ясно. Стек обеспечивает работу с рекурсивными функциями.

Определение 1.7

Стек - набор данных, в котором элементы обрабатываются согласно дисциплине "Первым пришел – последним ушел." (англ. Stack - пачка, стопка)

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

Правило интерпретации использует ассоциативный список – таблицу для связывания обозначений с их определениями. При таком подходе

6

Л.В. Городняя, Н.А. Березин

Введение в программирование на Лиспе

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

Определение 1.8

Переменная – именованная часть памяти, предназначенная для многократного доступа к изменяющимся данным.

Определение 1.9

Константа – именованная часть памяти, предназначенная для многократного доступа к фиксированным, не изменяющимся данным.

Типы данных в Лиспе включены в представление значений. Поэтому при вычислении они всегда известны и могут быть проверены в любой момент.

Определение 1.10

Тип данных – множество данных с соответствующим ему набором допустимых операций.

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

Функционирует Лисп-система с учетом комплекта встроенных определений атомов. Программа может влиять на этот комплект и формировать специализированные версии системы.

Термины "Ассоциативный список", "Атом", "Сборка мусора", "Свойства атома", "Список", "Символьные выражения", "S-выражения", "Форма", "Функциональное программирование" еще будут пояснены по ходу курса.

Элегантный лаконизм рекурсии может скрывать нелегкий путь. А.П.Ершов в предисловии к книге П.Хендерсона [2] привел поучительный пример задачи о рекурсивной формуле, сводящей вычитание единицы из натурального числа к прибавлению единицы:

{1 –1 = 0 ; ( n +1 ) -1 = n } ,

7

Л.В. Городняя, Н.А. Березин

Введение в программирование на Лиспе

не поддавшейся А.Чёрчу и решенной С.Клини лишь в 1932 году:

Пример 1.11)

{ F (x, y, z) = если (x = 1) то 0 иначе

если ((y +1) = x) то z иначе F (x, y +1, z +1) ; n –1 = F (n, 0, 0) }

алг F ( цел x, y, z) арг x, y, z

нач

если (x = 1)

то знач := 0

инес (y +1) /= x

то знач := F (x, y +1, z +1)

кон

алг N-1 (цел N) арг N нач знач := F (N, 0, 0) кон

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

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

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

8

Л.В. Городняя, Н.А. Березин Введение в программирование на Лиспе

из доступных элементов, и Emacs – весьма популярный текстовый редактор в мире UNIX/Linux.

Приверженцы Лиспа ценят его за элегантность, гибкость, а, главное, за способность к точному представлению программистских идей и удобство отладки. Методы программирования на Лиспе потребовали от авторов Лиспа большого числа нетрадиционных решений и соглашений, основа которых предложена и опробована Дж. Мак-Карти с его коллегами и учениками в определении этого языка (Lisp - list processing) и в первых реализациях Lisp 1.0 и Lisp 1.5. Наиболее общие из них признаны как принципы функционального программирования:

1.Унификация понятий <функция> и <значение>.

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

2.Кроме функций-констант вполне допустимы функциипеременные.

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

3.Самоприменимость.

Первые реализации Лиспа были выполнены методом раскрутки, причем в составе системы сразу были предусмотрены и интерпретатор и компилятор. Оба эти инструмента были весьма точно описаны на самом Лиспе, причем основной объем описаний не превосходил пару страниц.

9

Л.В. Городняя, Н.А. Березин

Введение в программирование на Лиспе

4.Интегральность ограничений на пространственно-временные характеристики.

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

5.Уточняемость решений.

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

6.Динамическое управление вычислениями и конструированием программ

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

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

В настоящее время наблюдается устойчивый рост рейтинга интерпретируемых языков программирования и включение в компилируемые языки механизмов >символьной обработки и средств

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]