- •Оглавление
- •Предисловие
- •Предисловие к русскому изданию
- •Глава 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. Анализ
- •Комментарии
- •Алфавитный указатель
168 |
Глава 9. Числа |
Полноценный трассировщик лучей в состоянии генерировать куда бо лее сложные изображения с учетом нескольких источников света раз ной интенсивности, расположенных в произвольных точках простран ства. Для этого программа должна учитывать эффекты отбрасывания теней. Расположение источника света рядом с глазом наблюдателя по зволило нам существенно упростить задачу, так как в этом случае ни одна из отбрасываемых теней не попадает в поле видимости.
Кроме того, полноценный трассировщик должен учитывать вторичные отражения. Разумеется, объекты различных цветов будут отражать свет по-разному. Тем не менее основной алгоритм, представленный на рис. 9.3, предоставляет механизм трассировки, который в дальнейшем может быть улучшен и дополнен, например с помощью рекурсивного исполь зования уже имеющихся методов.
Кроме того, реальная программа-трассировщик должна быть тщатель но оптимизирована. Наша программа имеет сжатые размеры и не опти мизирована ни как Лисп-программа, ни как трассировщик лучей. До бавление к программе одних только деклараций inline и деклараций типов (см. раздел 13.3) может обеспечить более чем двукратный при рост производительности.
Итоги главы
1.Common Lisp предоставляет в распоряжение целые числа, рацио нальные дроби, числа с плавающей запятой и комплексные числа.
2.Числовые значения могут быть преобразованы или упрощены, а их компоненты могут быть извлечены.
3.Предикаты сравнения чисел принимают любое количество аргумен тов и последовательно сравнивают их пары, за исключением /=, ко торый сравнивает все возможные пары аргументов.
4.В Common Lisp представлены практически все функции, имеющие ся в низкоуровневом инженерном калькуляторе. Одни и те же функ ции могут применяться к аргументам любых типов.
5.Числа типа fixnum – небольшие целые числа, умещающиеся в одном машинном слове. При необходимости они без предупреждения пре образуются к типу bignum. Однако затраты на его использование су щественно выше. Common Lisp также предоставляет до 4-х типов чи сел с плавающей запятой. Для каждой реализации ограничения на их размер свои и могут быть получены из специальных констант.
6.Трассировщик лучей генерирует изображение, отслеживая прохож дение света через смоделированный мир и вычисляя интенсивность излучения для каждого пиксела изображения.
Упражнения |
169 |
Упражнения
1. Определите функцию, принимающую список действительных чисел и возвращающую истину, когда числа следуют в порядке неубыва ния.
2. Определите функцию, принимающую целочисленную величину (ко личество центов) и возвращающую четыре значения, показываю щие, как собрать заданную сумму с помощью монет стоимостью 25, 10, 5 и 1 цент, используя наименьшее их количество.
3. На очень далекой планете живут два вида существ: вигглы и вобб лы. И первые, и вторые одинаково хорошо поют. Каждый год на этой планете проводится грандиозное соревнование, по результатам кото рого выбирают десять лучших певцов. Вот результаты за прошед шие десять лет:
Год |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
Вигглы |
6 |
5 |
6 |
4 |
5 |
5 |
4 |
5 |
6 |
5 |
Воблы |
4 |
5 |
4 |
6 |
5 |
5 |
6 |
5 |
4 |
5 |
|
|
|
|
|
|
|
|
|
|
|
Напишите программу, симулирующую подобные соревнования. Оп ределите по результату вашей программы, действительно ли жюри каждый год выбирает десять самых лучших певцов.
4. Определите функцию, принимающую 8 действительных чисел, пред ставляющих два отрезка в двумерном пространстве. Функция воз вращает nil, если отрезки не пересекаются, в противном случае воз вращаются два значения: x- и y-координаты точки их пересечения.
Пусть функция f имеет один действительный аргумент, а min и max – ненулевые действительные числа разных знаков; f имеет корень (воз вращает ноль) для некоторого числа i, такого что min < i < max. Опреде лите функцию, принимающую четыре аргумента f, min, max и epsilon
и возвращающую приближенное значение i с точностью до epsilon.
5.Метод Горнера позволяет эффективно решать полиномы. Чтобы найти ax3+bx2+cx+d, нужно вычислить x(x(ax+b)+c)+d. Определите функцию, принимающую один или несколько аргументов – значе ние x и следующие за ним n действительных чисел, представляю щих полином степени (n–1). Функция должна вычислять значение полинома для заданного x методом Горнера.
6.Сколько бит использовала бы ваша реализация для представления fixnum?
7.Сколько различных типов чисел с плавающей запятой представлено в вашей реализации?