- •Оглавление
- •Предисловие
- •Предисловие к русскому изданию
- •Глава 1. Введение
- •1.1. Новые инструменты
- •1.2. Новые приемы
- •1.3. Новый подход
- •Глава 2. Добро пожаловать в Лисп
- •2.1. Форма
- •2.2. Вычисление
- •2.3. Данные
- •2.4. Операции со списками
- •2.5. Истинность
- •2.6. Функции
- •2.7. Рекурсия
- •2.8. Чтение Лиспа
- •2.9. Ввод и вывод
- •2.10. Переменные
- •2.11. Присваивание
- •2.12. Функциональное программирование
- •2.13. Итерация
- •2.14. Функции как объекты
- •2.15. Типы
- •2.16. Заглядывая вперед
- •Итоги главы
- •Упражнения
- •Глава 3. Списки
- •3.1. Ячейки
- •3.2. Равенство
- •3.3. Почему в Лиспе нет указателей
- •3.4. Построение списков
- •3.5. Пример: сжатие
- •3.6. Доступ
- •3.7. Отображающие функции
- •3.8. Деревья
- •3.9. Чтобы понять рекурсию, нужно понять рекурсию
- •3.10. Множества
- •3.11. Последовательности
- •3.12. Стопка
- •3.13. Точечные пары
- •3.14. Ассоциативные списки
- •3.15. Пример: поиск кратчайшего пути
- •3.16. Мусор
- •Итоги главы
- •Упражнения
- •Глава 4. Специализированные структуры данных
- •4.1. Массивы
- •4.2. Пример: бинарный поиск
- •4.3. Строки и знаки
- •4.4. Последовательности
- •4.5. Пример: разбор дат
- •4.6. Структуры
- •4.7. Пример: двоичные деревья поиска
- •4.8. Хеш-таблицы
- •Итоги главы
- •Упражнения
- •Глава 5. Управление
- •5.1. Блоки
- •5.2. Контекст
- •5.3. Условные выражения
- •5.4. Итерации
- •5.5. Множественные значения
- •5.6. Прерывание выполнения
- •5.7. Пример: арифметика над датами
- •Итоги главы
- •Упражнения
- •Глава 6. Функции
- •6.1. Глобальные функции
- •6.2. Локальные функции
- •6.3. Списки параметров
- •6.4. Пример: утилиты
- •6.5. Замыкания
- •6.6. Пример: строители функций
- •6.7. Динамический диапазон
- •6.8. Компиляция
- •6.9. Использование рекурсии
- •Итоги главы
- •Упражнения
- •Глава 7. Ввод и вывод
- •7.1. Потоки
- •7.2. Ввод
- •7.3. Вывод
- •7.4. Пример: замена строк
- •7.5. Макрознаки
- •Итоги главы
- •Упражнения
- •Глава 8. Символы
- •8.1. Имена символов
- •8.2. Списки свойств
- •8.3. А символы-то не маленькие
- •8.4. Создание символов
- •8.5. Использование нескольких пакетов
- •8.6. Ключевые слова
- •8.7. Символы и переменные
- •8.8. Пример: генерация случайного текста
- •Итоги главы
- •Упражнения
- •Глава 9. Числа
- •9.1. Типы
- •9.2. Преобразование и извлечение
- •9.3. Сравнение
- •9.4. Арифметика
- •9.5. Возведение в степень
- •9.6. Тригонометрические функции
- •9.7. Представление
- •9.8. Пример: трассировка лучей
- •Итоги главы
- •Упражнения
- •Глава 10. Макросы
- •10.1. Eval
- •10.2. Макросы
- •10.3. Обратная кавычка
- •10.4. Пример: быстрая сортировка
- •10.5. Проектирование макросов
- •10.6. Обобщенные ссылки
- •10.7. Пример: макросы-утилиты
- •10.8. На Лиспе
- •Итоги главы
- •Упражнения
- •Глава 11. CLOS
- •11.1. Объектно-ориентированное программирование
- •11.2. Классы и экземпляры
- •11.3. Свойства слотов
- •11.4. Суперклассы
- •11.5. Предшествование
- •11.6. Обобщенные функции
- •11.7. Вспомогательные методы
- •11.8. Комбинация методов
- •11.9. Инкапсуляция
- •11.10. Две модели
- •Итоги главы
- •Упражнения
- •Глава 12. Структура
- •12.1. Разделяемая структура
- •12.2. Модификация
- •12.3. Пример: очереди
- •12.4. Деструктивные функции
- •12.5. Пример: двоичные деревья поиска
- •12.6. Пример: двусвязные списки
- •12.7. Циклическая структура
- •12.8. Неизменяемая структура
- •Итоги главы
- •Упражнения
- •Глава 13. Скорость
- •13.1. Правило бутылочного горлышка
- •13.2. Компиляция
- •13.3. Декларации типов
- •13.4. Обходимся без мусора
- •13.5. Пример: заранее выделенные наборы
- •13.6. Быстрые операторы
- •13.7. Две фазы разработки
- •Итоги главы
- •Упражнения
- •Глава 14. Более сложные вопросы
- •14.1. Спецификаторы типов
- •14.2. Бинарные потоки
- •14.3. Макросы чтения
- •14.4. Пакеты
- •14.5. Loop
- •14.6. Особые условия
- •Глава 15. Пример: логический вывод
- •15.1. Цель
- •15.2. Сопоставление
- •15.3. Отвечая на запросы
- •15.4. Анализ
- •Глава 16. Пример: генерация HTML
- •16.1. HTML
- •16.2. Утилиты HTML
- •16.3. Утилита для итерации
- •16.4. Генерация страниц
- •Глава 17. Пример: объекты
- •17.1. Наследование
- •17.2. Множественное наследование
- •17.3. Определение объектов
- •17.4. Функциональный синтаксис
- •17.5. Определение методов
- •17.6. Экземпляры
- •17.7. Новая реализация
- •17.8. Анализ
- •Комментарии
- •Алфавитный указатель
По договору между издательством «Символ-Плюс» и Интернет-магазином «Books.Ru – Книги России» единственный легальный способ получения дан ного файла с книгой ISBN 978-5-93286-206-3, название «ANSI Common Lisp» – покупка в Интернет-магазине «Books.Ru – Книги России». Если Вы получили данный файл каким-либо другим образом, Вы нарушили международное законодательство и законодательство Российской Федерации об охране авторского права. Вам необходимо удалить данный файл, а также сообщить издательству «Символ-Плюс» (piracy@symbol.ru), где именно Вы получили данный файл.
ANSI
Common Lisp
Paul Graham
P R E N T I C E H A L L
ANSI
Common Lisp
Пол Грэм
Санкт-Петербург – Москва 2012
Серия «High tech»
Пол Грэм
ANSI Common Lisp
Перевод И. Хохлов
Главный редактор |
А. Галунов |
Зав. редакцией |
Н. Макарова |
Научный редактор |
В. Демкин |
Редактор |
А. Родин |
Корректор |
С. Беляева |
Верстка |
Д. Орлова |
Грэм П.
ANSI Common Lisp. – Пер. с англ. – СПб.: Символ-Плюс, 2012. – 448 с., ил. ISBN 978-5-93286-206-3
Книга «ANSI Common Lisp» сочетает в себе введение в программирование на Лиспе и актуальный справочный материал по ANSI-стандарту языка. Новички найдут в ней примеры интересных программ с их тщательным объяснением. Профессиональные разработчики оценят всесторонний практический подход.
Автор постарался показать уникальные особенности, которые выделяют Лисп из множества других языков программирования, а также предоставляемые им новые возможности, например макросы, которые позволяют разработчику писать программы, которые будут писать другие программы. Лисп – единст венный язык, который позволяет с легкостью осуществлять это, потому что только он предлагает необходимые для этого абстракции.
Книга содержит: детальное рассмотрение объектно-ориентированного про граммирования – не только описание CLOS, но и пример собственного встроенного объектно-ориентированного языка; более 20 самостоятельных примеров, в том числе трассировщик лучей, генератор случайного текста, сопоставление с образцом, логический вывод, программа для генерации HTML, алгоритмы поиска и сортировки, файлового ввода-вывода, сжатия данных, а также вычислительные задачи. Особое внимание уделяется критически важным кон цепциям, включая префиксный синтаксис, связь кода и данных, рекурсию, функциональное программирование, типизацию, неявное использование ука зателей, динамическое выделение памяти, замыкания, макросы, предшест вование классов, суть методов обобщенных функций и передачи сообщений. Вы найдете полноценное руководство по оптимизации, примеры различных стилей программирования, включая быстрое прототипирование, разработку снизу-вверх, объектно-ориентированное программирование и применение встраиваемых языков.
ISBN 978-5-93286-206-3
ISBN 0-13-370875-6 (англ)
© Издательство Символ-Плюс, 2012
Authorized translation of the English edition © 1996 Prentice Hall, Inc. This trans lation is published and sold by permission of Prentice Hall, Inc., the owner of all rights to publish and sell the same.
Все права на данное издание защищены Законодательством РФ, включая право на полное или час тичное воспроизведение в любой форме. Все товарные знаки или зарегистрированные товарные зна ки, упоминаемые в настоящем издании, являются собственностью соответствующих фирм.
Издательство «Символ-Плюс». 199034, Санкт-Петербург, 16 линия, 7, тел. (812) 380-5007, www.symbol.ru. Лицензия ЛП N 000054 от 25.12.98.
Подписано в печать 03.10.2012. Формат 70×100 1/16. Печать офсетная. Объем 28 печ. л.
Оглавление
Предисловие 13 Предисловие к русскому изданию 17
1. Введение 19
1.1. Новые инструменты 19
1.2. Новые приемы 21
1.3. Новый подход 22
2. Добро пожаловать в Лисп 25
2.1. Форма 25
2.2. Вычисление 27 2.3. Данные 28
2.4. Операции со списками 30
2.5. Истинность 30
2.6. Функции 32
2.7. Рекурсия 33 2.8. Чтение Лиспа 34
2.9. Ввод и вывод 35 2.10. Переменные 37
2.11. Присваивание 38
2.12. Функциональное программирование 39 2.13. Итерация 40 2.14. Функции как объекты 42 2.15. Типы 44
2.16. Заглядывая вперед 44
Итоги главы 45 Упражнения 46
3. Списки 48
3.1. Ячейки 48
3.2. Равенство 50 3.3. Почему в Лиспе нет указателей 51
3.4. Построение списков 53 3.5. Пример: сжатие 53 3.6. Доступ 55 3.7. Отображающие функции 56
6 |
Оглавление |
3.8. Деревья 57
3.9. Чтобы понять рекурсию, нужно понять рекурсию 58
3.10. Множества 60 3.11. Последовательности 61 3.12. Стопка 63 3.13. Точечные пары 65 3.14. Ассоциативные списки 66 3.15. Пример: поиск кратчайшего пути 67
3.16. Мусор 69 Итоги главы 70
Упражнения 71
4. Специализированные структуры данных 73
4.1. Массивы 73 4.2. Пример: бинарный поиск 75
4.3. Строки и знаки 77 4.4. Последовательности 78
4.5. Пример: разбор дат 81 4.6. Структуры 83 4.7. Пример: двоичные деревья поиска 85
4.8. Хеш-таблицы 90 Итоги главы 93
Упражнения 94
5. Управление 95
5.1. Блоки 95 5.2. Контекст 97
5.3. Условные выражения 99 5.4. Итерации 100 5.5. Множественные значения 103 5.6. Прерывание выполнения 104 5.7. Пример: арифметика над датами 106
Итоги главы 109
Упражнения 110
6. Функции 111
6.1. Глобальные функции 111 6.2. Локальные функции 112 6.3. Списки параметров 113
6.4. Пример: утилиты 115
6.5. Замыкания 118
6.6. Пример: строители функций 120 6.7. Динамический диапазон 123
6.8. Компиляция 124 6.9. Использование рекурсии 125
Итоги главы 128 Упражнения 128
Оглавление |
7 |
7. Ввод и вывод 130
7.1. Потоки 130 7.2. Ввод 132 7.3. Вывод 134
7.4. Пример: замена строк 136
7.5. Макрознаки 141
Итоги главы 142
Упражнения 142
8. Символы 144
8.1. Имена символов 144 8.2. Списки свойств 145
8.3. А символы-то не маленькие 146 8.4. Создание символов 146
8.5. Использование нескольких пакетов 147 8.6. Ключевые слова 148 8.7. Символы и переменные 149
8.8. Пример: генерация случайного текста 149 Итоги главы 152
Упражнения 152
9. Числа 154
9.1. Типы 154 9.2. Преобразование и извлечение 155
9.3. Сравнение 157 9.4. Арифметика 158
9.5. Возведение в степень 159 9.6. Тригонометрические функции 159
9.7. Представление 160 9.8. Пример: трассировка лучей 161
Итоги главы 168
Упражнения 169
10. Макросы 170
10.1. Eval 170 10.2. Макросы 172 10.3. Обратная кавычка 173
10.4. Пример: быстрая сортировка 174
10.5. Проектирование макросов 175
10.6. Обобщенные ссылки 178 10.7. Пример: макросы-утилиты 179
10.8. На Лиспе 182 Итоги главы 183 Упражнения 183
8 |
Оглавление |
11. CLOS 185
11.1. Объектно-ориентированное программирование 185
11.2. Классы и экземпляры 187 11.3. Свойства слотов 188
11.4. Суперклассы 190
11.5. Предшествование 190
11.6. Обобщенные функции 192
11.7. Вспомогательные методы 195 11.8. Комбинация методов 197 11.9. Инкапсуляция 198
11.10. Две модели 199 Итоги главы 200
Упражнения 201
12. Структура 202
12.1. Разделяемая структура 202 12.2. Модификация 205
12.3. Пример: очереди 206 12.4. Деструктивные функции 208
12.5. Пример: двоичные деревья поиска 209 12.6. Пример: двусвязные списки 212 12.7. Циклическая структура 215
12.8. Неизменяемая структура 217 Итоги главы 218
Упражнения 218
13. Скорость 220
13.1. Правило бутылочного горлышка 220
13.2. Компиляция 221 13.3. Декларации типов 224
13.4. Обходимся без мусора 229
13.5. Пример: заранее выделенные наборы 232 13.6. Быстрые операторы 234 13.7. Две фазы разработки 236 Итоги главы 237
Упражнения 238
14. Более сложные вопросы 239
14.1. Спецификаторы типов 239
14.2. Бинарные потоки 241 14.3. Макросы чтения 241
14.4. Пакеты 243 14.5. Loop 246 14.6. Особые условия 250
Оглавление |
9 |
15. Пример: логический вывод 253
15.1. Цель 253 15.2. Сопоставление 254 15.3. Отвечая на запросы 256
15.4. Анализ 261
16. Пример: генерация HTML 263
16.1. HTML 263 16.2. Утилиты HTML 265
16.3. Утилита для итерации 268 16.4. Генерация страниц 269
17. Пример: объекты 274
17.1. Наследование 274
17.2. Множественное наследование 276 17.3. Определение объектов 278
17.4. Функциональный синтаксис 279 17.5. Определение методов 280 17.6. Экземпляры 281
17.7. Новая реализация 282 17.8. Анализ 288
A. Отладка 290 B. Лисп на Лиспе 299 C. Изменения в Common Lisp 307 D. Справочник по языку 314
Комментарии 421
Алфавитный указатель 436
Half lost on my firmness gains to more glad heart,
Or violent and from forage drives
A glimmering of all sun new begun
Both harp thy discourse they march’d,
Forth my early, is not without delay;
For their soft with whirlwind; and balm.
Undoubtedly he scornful turn’d round ninefold,
Though doubled now what redounds,
And chains these a lower world devote, yet inflicted?
Till body or rare, and best things else enjoy’d in heav’n
To stand divided light at ev’n and poise their eyes,
Or nourish, lik’ning spiritual, I have thou appear. 1
Henley
Я потерял итог моих трудов, что сердце грели мне,
Ибыло то ожесточенье сердца иль движение вперед, Но солнце снова озарило нас,
Иарфа вновь твоя заговорила,
Вперед, как можно раньше и без промедленья; Тот ураган для них стал мягок, как бальзам.
Он тень сомнения отверг и обвился вокруг с насмешкой девять раз, Наперекор тому, что дважды отразилось эхом, И цепи эти уходили к преисподней, разве не ужасно? Покуда тело дивное испытывало райские услады
Стоять мне, рассеченным светом, и взглядом воспарить, Иль вскормленный, подобно духам, я появился пред тобою.
Henley
1Эта строфа написана программой Henley на основе поэмы Джона Мильтона «Потерянный рай». Можете попытаться найти тут смысл, но лучше загля ните в главу 8. – Прим. перев.