Common Lisp (Коммон Лісп) — діалект мови програмування Лісп, визначений стандартом ANSI X3.226-1994. Розроблений з метою стандартизації різних варіантів мови Лісп що існували до появи стандарту. Цей діалект не є реалізацією, а, натомість, лише специфікацією мови програмування.

Common Lisp
Парадигма декілька: імперативна, функціональна, об'єктно-орієнтована
Дата появи 1984
Творці Scott E. Fahlmand, Richard P. Gabrield і David Moond
Розробник ANSI
Останній реліз X3.226-1994 (1994)
Система типізації динамічна типізація[d] і строга типізація
Під впливом від Smalltalk, Knowledge Representation Language, Лісп
Операційна система Cross-platform
Вебсайт common-lisp.net

Мова програмування Коммон Лісп реалізує декілька парадигм, зокрема:

Типи даних ред.

В Коммон Лісп тип даних мають об'єкти, що зберігаються в змінних, а не самі змінні (що відповідає динамічній системі типізації). Кожна змінна може мати як значення будь-який об'єкт Лісп. Задля покращення швидкодії, дозволяється декларувати певні обмеження на можливі типи значень змінних.[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) виконує другу форму, а якщо значення не істина і задана третя форма — то третю (так зване анафоричне якщо):

(defmacro aif (test then &optional else)
  `(let ((it ,test))
    (if it ,then ,else)))

При цьому, запам'ятоване у змінній it значення першої форми доступне під час виконання обох наступних:

(aif (тривале-та-складне-обчислення)
  (print it))

що відповідає наступному псевдокоду:

it := тривале-та-складне-обчислення()
if it then
  print it

Об'єктно-орієнтоване програмування ред.

Докладніше: CLOS

Об'єктна система Коммон Ліспа (CLOS) є розширенням Коммон Ліспа, що додає підтримку можливостей об'єктно-орієнтованого програмування в Коммон Лісп. В основі цього розширення знаходяться загальні функції, множинне успадкування, декларативне комбінування методів, та мета-об'єктний протокол.[3]

Фундаментальними об'єктами CLOS є класи, екземпляри класів, загальні функції, та методи.

Загальна функція, це функція, поведінка якої залежить від класів або значень переданих аргументів. Об'єкт загальної функції містить множину методів, лямбда-список, тип комбінування методів, та іншу інформацію. Методи визначають поведінку загальних функцій в залежності від класів переданих аргументів; іншими словами, методи виконують спеціалізацію загальних функцій. Будучи викликаною, загальна функція виконує підмножину власних методів в залежності від класів аргументів.[4] Звичайна функція Коммон Лісп має одне «тіло» (список інструкцій), що завжди виконується при виклику функції. На відміну від звичайних функцій, загальні функції мають множину «тіл», лише підмножина яких виконується під час виклику загальної функції. Обрані «тіла», та спосіб їхньої комбінації залежить від класів параметрів загальної функції та способом комбінування.

Реалізації ред.

Станом на листопад 2007 року, існують такі реалізації специфікації Коммон Лісп, що мали активну підтримку спільноти розробників:[5]

Примітки ред.

  1. Kent Pitman (1996). Common Lisp HyperSpec. The Harlequin Group Limited. Архів оригіналу за 5 серпня 2002. Процитовано 26 грудня 2007.
  2. Paul Graham, ANSI Common Lisp, Prentice Hall, 1996.
  3. Guy L. Steele Jr. Common Lisp the Language (вид. 2-ге).
  4. Daniel G. Bobrow, Linda G. DeMichiel, Richard P. Gabriel, Sonya E. Keene, Gregor Kiczales, and David A. Moon. (1988). Common Lisp Object System Specification.
  5. Daniel Weinreb, «Common Lisp Implementations: A Survey [Архівовано 21 квітня 2012 у Wayback Machine.]», version 2.

Див. також ред.

Посилання ред.