Common Lisp (Коммон Лісп) — діалектмови програмуванняЛісп, визначений стандартом ANSI X3.226-1994. Розроблений з метою стандартизації різних варіантів мови Лісп що існували до появи стандарту. Цей діалект не є реалізацією, а, натомість, лише специфікацією мови програмування.
Мова програмування Коммон Лісп реалізує декілька парадигм, зокрема:
Динамічна мова програмування, що сприяє пришвидшенню розробки програм шляхом ітеративної компіляції.
Містить CLOS, об'єктну систему, що підтримує мультиметоди та комбінації методів.
Може розширюватись через стандартні механізми макросів.
Типи даних
В Коммон Лісп тип даних мають об'єкти, що зберігаються в змінних, а не самі змінні (що відповідає динамічній системі типізації). Кожна змінна може мати як значення будь-який об'єкт Лісп. Задля покращення швидкодії, дозволяється декларувати певні обмеження на можливі типи значень змінних.[1]
Множина всіх об'єктів позначається символом t. Порожня множина об'єктів або порожній список позначається символом nil що відповідає логічному «не вірно». Будь-яке інше значення окрім nil вважається логічним «вірно».
Числа : в Коммон Лісп є типи даних для цілих будь-якого розміру (обмежується кількістю наявної пам'яті), раціональні числа (утворюються при діленні цілих), числа з рухомою комою, та комплексні числа.
Літери : представлення як печатних літер, так символів спеціального призначення.
Символи (атоми) : іменовані дані. Кожен символ має список атрибутів, та може містити будь-який об'єкт Ліспа. Можуть використовуватись як змінні або функції.
Списки : послідовності, представлені у вигляді зв'язаних комірок консів (cons). Списки утворюються рекурсивно, доданням нового елемента у вже існуючий список створюючи нову cons. cons є об'єктом Лісп, що має два поля: car може мати будь-яке значення, та cdrвказівник на попередній cons.
Масиви : колекції об'єктів Лісп певної вимірності. В масивах можуть зберігатись будь-які об'єкти Лісп. Існують, для покращення ефективності роботи, масиви, що можуть містити елементи лише певного типу. Одновимірний масив з елементами будь-якого типу має назву вектор, масив літер рядок, бітів біт-вектор.
Хеш таблиці : надають механізм ефективного зіставлення будь-якого об'єкта (ключ) з іншим об'єктом (значення).
Пакети : колекції символів, що використовуються як простори імен.
Імена файлів : відповідають іменам файлів у спосіб, максимально не залежний від реалізації файлової системи.
Потоки : використовуються для операцій введення/виведення, та для читання інформації із рядків.
Випадкові структури : структури даних, що використовуються для збереження інформації про стан вбудованого генератора випадкових чисел.
Записи : структури даних, що визначаються користувачем. Записи мають іменовані складові.
Умови : використовуються як сигнали для керування порядком роботи програми. Подібні до виключних ситуацій (англ.Exceptions) в деяких мовах програмування.
Крім цих типів даних, CLOS визначає типи даних для класів, методів, загальних методів.
Макроси
В Коммон Ліспі макроси (англ.macro) — це оператори, що реалізуються шляхом перетворення коду. Макрос визначається тим, як буде перетворено код, що його викликає. Перетворення, що ще зветься розкриттям макроса (англ.macro expansion) виконується компілятором автоматично. Як наслідок — код, створений макросом стає такою ж частиною коду, як і введений користувачем код програми.[2]
До типових випадків використання макросів належать:
нові структури керування порядком виконанням (цикли, відгалуження тощо)
конструкції області видимості та зв'язування змінних
спрощення складних фрагментів кодів, що часто повторюються
визначення форм вищого рівня з побочними ефектами часу компіляції
програмування кероване даними
вбудовані предметно-орієнтовані мови програмування (SQL, HTML, Пролог тощо).
Макроси задають макросом defmacro. Спеціальний оператор macrolet дозволяє визначення локальних макросів. Також можливо задавати макроси для символів використанням define-symbol-macro та symbol-macrolet.
Книжка On Lisp Пола Грехема присвячена докладному розгляду можливостей макросів в Коммон Лісп.
Приклади
Наприклад, наступний макрос визначає оператор aif, що отримує дві або три форми, обчислює значення першої, запам'ятовує його в змінній it та у випадку якщо значення істина (t) виконує другу форму, а якщо значення не істина і задана третя форма — то третю (так зване анафоричне якщо):
Об'єктна система Коммон Ліспа (CLOS) є розширенням Коммон Ліспа, що додає підтримку можливостей об'єктно-орієнтованого програмування в Коммон Лісп. В основі цього розширення знаходяться загальні функції, множинне успадкування, декларативне комбінування методів, та мета-об'єктний протокол.[3]
Загальна функція, це функція, поведінка якої залежить від класів або значень переданих аргументів. Об'єкт загальної функції містить множину методів, лямбда-список, тип комбінування методів, та іншу інформацію. Методи визначають поведінку загальних функцій в залежності від класів переданих аргументів; іншими словами, методи виконують спеціалізацію загальних функцій. Будучи викликаною, загальна функція виконує підмножину власних методів в залежності від класів аргументів.[4] Звичайна функція Коммон Лісп має одне «тіло» (список інструкцій), що завжди виконується при виклику функції. На відміну від звичайних функцій, загальні функції мають множину «тіл», лише підмножина яких виконується під час виклику загальної функції. Обрані «тіла», та спосіб їхньої комбінації залежить від класів параметрів загальної функції та способом комбінування.
Реалізації
Станом на листопад2007 року, існують такі реалізації специфікації Коммон Лісп, що мали активну підтримку спільноти розробників:[5]
↑Paul Graham, ANSI Common Lisp, Prentice Hall, 1996.
↑Guy L. Steele Jr. Common Lisp the Language (вид. 2-ге).
↑Daniel G. Bobrow, Linda G. DeMichiel, Richard P. Gabriel, Sonya E. Keene, Gregor Kiczales, and David A. Moon. (1988). Common Lisp Object System Specification.