Обычная шепелявость
-
История и стандартизация
- Common Lisp (CL) разработан как стандартизированный преемник Maclisp
- Стандарт ANSI Common Lisp опубликован в 1994 году
- CL HyperSpec создана на основе стандарта ANSI Common Lisp
-
Синтаксис и типы данных
- CL использует S-выражения для кода и структур данных
- Типы данных включают скалярные, символьные, логические и структуры данных
- Символы могут быть уникальными именованными объектами данных
-
Структуры данных
- Списки состоят из последовательностей cons
- Векторы и массивы поддерживают динамическое изменение размера
- Хэш-таблицы хранят связи между объектами
- Пакеты используются для разделения программы на пространства имен
- Структуры и классы поддерживают сложные структуры данных
-
Функции и определения
- CL поддерживает первоклассные функции и функции более высокого порядка
- Функции могут принимать другие функции в качестве аргументов
- Макрос defun определяет функции с помощью имени, аргументов и тела
- Анонимные функции определяются с помощью лямбда-выражений
- Локальные функции определяются с помощью flet и меток
- Функции могут быть скомпилированы с помощью оператора compile
-
Макросы и методы
- Макрос defgeneric определяет общие функции
- Макрос defmethod определяет методы
- Методы могут специализироваться по закрытым стандартным классам, системным классам, структурным классам или отдельным объектам
- Универсальные функции также являются первоклассным типом данных
-
Пространство имен функций
- Пространство имен для имен функций отделено от пространства имен переменных данных
- В Common Lisp операторы, определяющие имена в пространстве имен функций, включают defun, flet, labels, defmethod и defgeneric
- Для передачи функции по имени в качестве аргумента другой функции используется оператор function
-
Модель вычисления Scheme
- В Scheme существует только одно пространство имен
- Вычисляются все позиции в форме, а не только аргументы
- Код, написанный на одном диалекте, может сбивать с толку программистов на другом
-
Множественные возвращаемые значения
- Common Lisp поддерживает концепцию множественных значений
- Выражение может иметь одно первичное значение и любое количество вторичных значений
- Вторичные значения передаются по выделенному побочному каналу
-
Другие типы данных
- Имена путей представляют файлы и каталоги
- Потоки ввода и вывода представляют источники и приемники данных
- Встроенные генератор псевдослучайных чисел и объекты случайного состояния
- Условия представляют ошибки и исключения
- Классы являются объектами первого класса и сами являются экземплярами классов
- Readtables управляют анализом текста исходного кода
-
Масштаб
- Программы на Common Lisp используют имена для обозначения переменных, функций и объектов
- Область применения зависит от расположения ссылки, типа выражения и конструкции привязки
- Среда — это словарь времени выполнения, сопоставляющий символы с привязками
-
Виды окружающей среды
- Глобальный: ссылки на новый тип становятся известны везде
- Динамический: привязки устанавливаются в начале выполнения конструкции и исчезают при завершении
- Динамическая область видимости полезна для ясности и дисциплины глобальных переменных
-
Ошибки с глобальными переменными
- Небрежная замена значения глобальной переменной может привести к ошибкам.
- Присвоение новой локальной привязки внутри выражения может избежать ошибок.
-
Динамические переменные
- Динамические переменные создают временные ячейки памяти для переменных.
- Привязка переменной временно скрывает предыдущую привязку.
- Динамические переменные могут использоваться для передачи контекстной информации.
-
Лексические переменные
- Лексические переменные имеют лексическую область видимости.
- Лексические привязки могут иметь неопределенный или динамический экстент.
- Лексические привязки полезны для эффективного машинного кода и функционального программирования.
-
Макросы
- Макросы преобразуют исходный код программы.
- Макросы могут создавать новые управляющие структуры и упрощать синтаксис.
- Макросы используются для реализации стандартных функций и встроенных языков.
-
Пример макроса
- Макрос until предоставляет конструкцию цикла until.
- Макрос использует tagbody для проверки условия и перехода к тегам.
- Пример использования макроса until демонстрирует его применение.
-
Расширение макросов в Common Lisp
- Макросы расширяются перед оценкой или компиляцией кода.
- Макросы могут использовать любые операторы Common Lisp.
- Макросы могут захватывать переменные, что может привести к дефектам.
-
Переменный захват и затенение
- Макросы могут захватывать символы из контекста вызова.
- Захват может привести к дефектам, если символы используются в разных контекстах.
- Gensyms и пакеты используются для предотвращения захвата.
-
Система кондиционирования
- Система условий обрабатывает исключения в Common Lisp.
- Условия описываются объектами, обработчики вызываются при возникновении условия.
- Перезапуски позволяют автоматически устранять проблемы.
-
Объектная система Common Lisp (CLOS)
- CLOS включает инструменты для объектно-ориентированного программирования.
- CLOS позволяет изменять функции и классы во время выполнения.
- CLOS интегрирована в ANSI Common Lisp.
-
Компилятор и интерпретатор
- Интерпретатор выполняет исходный код Lisp.
- Компилятор генерирует байт-код или машинный код.
- Common Lisp требует лексическую область видимости для интерпретатора и компилятора.
- Компилятор может быть вызван с помощью функций compile и compile-file.
- Функция eval оценивает код в виде s-выражений.
-
Реализация Common Lisp
- Несколько реализаций Common Lisp используют компилятор для выполнения кода.
- Файловый компилятор генерирует файлы fasl, которые можно загружать в систему.
- Файловый компилятор может генерировать байт-код, код на Си или машинный код.
-
Интерактивный режим
- Common Lisp можно использовать в интерактивном режиме, даже если код полностью скомпилирован.
- Язык проводит различие между временем чтения, компиляции, загрузки и выполнения.
- Предусмотрены специальные операторы для интерактивной разработки.
-
Примеры кода
- Парадокс дня рождения: вычисление наименьшего количества людей с вероятностью уникальных дней рождения менее 50%.
- Сортировка списка объектов-персон: определение класса person и метода отображения имени и возраста.
- Возведение в степень путем возведения в квадрат: использование макроса LOOP.
- Поиск списка доступных оболочек: использование макроса WITH-OPEN-FILE и функции AVAILABLE-SHELLS.
-
Сравнение с другими языками
- Common Lisp часто сравнивают со Scheme, но они имеют различия.
- Common Lisp использует лексическую переменную scope, в отличие от Scheme.
- CL поддерживает переменные с динамической областью действия, но они должны быть явно объявлены.
-
Реализации и приложения
- Существует множество реализаций Common Lisp, которые могут существенно отличаться.
- Реализации могут использовать компиляцию машинного кода, байт-кода или интерпретацию.
- Common Lisp используется для разработки исследовательских приложений, прототипов и коммерческих приложений.
- Примеры приложений включают Yahoo!, ACT-R, Authorizer’s Assistant, Cyc, Gensym G2, Genworks GDL, Jak and Daxter, ITA Software, Mirai и Opusmodus.
-
История и развитие Common Lisp
- Common Lisp (CL) — язык программирования, разработанный в 1980-х годах.
- CL основан на Lisp, но имеет более структурированный синтаксис и более развитую систему типов данных.
- CL стал популярным благодаря своей гибкости и возможности создания сложных систем.
-
Применение Common Lisp
- CL используется в различных областях, включая искусственный интеллект, компьютерную композицию, анализ самолетов и обработку сигналов.
- Примеры приложений: Piano, Grammarly, DART, Deep Space 1, SigLab, SPIKE, .NET Common Language Runtime.
-
Инструменты и библиотеки
- Quicklisp — популярный менеджер библиотек для CL.
- The Awesome CL list — список фреймворков и библиотек CL.
- CLiki — Вики-страница для систем CL с открытым исходным кодом.
- Common-Lisp.net — репозиторий бесплатного программного обеспечения CL.
- lisp-lang.org — документация и демонстрация историй успеха.
-
Учебные материалы и ресурсы
- Существует множество книг и учебных пособий по CL, включая руководства по программированию, объектно-ориентированному программированию и искусственному интеллекту.
- Примеры: Гай Л. Steele, Родни Аллен Брукс, Ричард П. Габриэль, Роберт Виленски, Юджин Чарняк и другие.
-
Современные проекты и разработки
- Современные проекты и разработки на CL включают ACL2, Аксиома, Maxima, OpenMusic, Pgloader, Stumpwm.
- Примеры современных проектов: ACL2, Аксиома, Maxima, OpenMusic, Pgloader, Stumpwm.