Common Lisp
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 |
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
) виконує другу форму, а якщо значення не істина і задана третя форма — то третю (так зване анафоричне якщо):
(defmacro aif (test then &optional else)
`(let ((it ,test))
(if it ,then ,else)))
При цьому, запам'ятоване у змінній it
значення першої форми доступне під час виконання обох наступних:
(aif (тривале-та-складне-обчислення)
(print it))
що відповідає наступному псевдокоду:
it := тривале-та-складне-обчислення()
if it then
print it
Об'єктна система Коммон Ліспа (CLOS) є розширенням Коммон Ліспа, що додає підтримку можливостей об'єктно-орієнтованого програмування в Коммон Лісп. В основі цього розширення знаходяться загальні функції, множинне успадкування, декларативне комбінування методів, та мета-об'єктний протокол.[3]
Фундаментальними об'єктами CLOS є класи, екземпляри класів, загальні функції, та методи.
Загальна функція, це функція, поведінка якої залежить від класів або значень переданих аргументів. Об'єкт загальної функції містить множину методів, лямбда-список, тип комбінування методів, та іншу інформацію. Методи визначають поведінку загальних функцій в залежності від класів переданих аргументів; іншими словами, методи виконують спеціалізацію загальних функцій. Будучи викликаною, загальна функція виконує підмножину власних методів в залежності від класів аргументів.[4] Звичайна функція Коммон Лісп має одне «тіло» (список інструкцій), що завжди виконується при виклику функції. На відміну від звичайних функцій, загальні функції мають множину «тіл», лише підмножина яких виконується під час виклику загальної функції. Обрані «тіла», та спосіб їхньої комбінації залежить від класів параметрів загальної функції та способом комбінування.
Станом на листопад 2007 року, існують такі реалізації специфікації Коммон Лісп, що мали активну підтримку спільноти розробників:[5]
- Allegro CL [Архівовано 18 червня 2020 у Wayback Machine.] — комерційна ліцензія, Linux, Unix, Mac, Windows.
- Armed Bear CL (ABCL) — GPL (з винятком), на Java 1.4 та новіше.
- CMU CL [Архівовано 30 жовтня 2005 у Wayback Machine.] (CMUCL) — вільний, Linux, Unix, Mac.
- Clozure CL [Архівовано 16 червня 2008 у Wayback Machine.] (OpenMCL) — LLGPL, Linux, Unix, Mac.
- Corman CL [Архівовано 25 жовтня 2005 у Wayback Machine.] — комерційна ліцензія, Windows.
- Embedded CL [Архівовано 26 грудня 2007 у Wayback Machine.] (ECL) — LGPL, Linux, Unix, Mac, Windows.
- GNU CL [Архівовано 6 березня 2008 у Wayback Machine.] (GCL) — LGCP, GPL, Linux, Unix, Mac
- GNU clisp (CLISP) — GPL, Linux, Unix, Mac, Windows.
- LispWorks [Архівовано 25 жовтня 2005 у Wayback Machine.] — комерційна ліцензія, Linux, Unix, Mac, Windows.
- Scieneer CL (SCL) — комерційна ліцензія, Linux, Unix.
- Steel Bank CL (SBCL) — BSD/Відкрита, Linux, Unix, Mac.
- ↑ Kent Pitman (1996). Common Lisp HyperSpec. The Harlequin Group Limited. Архів оригіналу за 5 серпня 2002. Процитовано 26 грудня 2007.
- ↑ 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.
- ↑ Daniel Weinreb, «Common Lisp Implementations: A Survey [Архівовано 21 квітня 2012 у Wayback Machine.]», version 2.
- Scheme — ще один популярний діалект мови програмування Лісп.
- Лямбда числення
- Common Lisp, каталог посилань Open Directory Project
- Association of Lisp Users [Архівовано 28 квітня 2021 у Wayback Machine.](англ.) — асоціація користувачів Лісп.
- Common Lisp Wiki [Архівовано 5 квітня 2022 у Wayback Machine.](англ.) — Вікі, присвячена Коммон Лісп.
- Підручники
- Peter Seibel, Practical Common Lisp [Архівовано 29 липня 2005 у Wayback Machine.](англ.) — вільно доступний підручник з Коммон Лісп.
- The Common Lisp Cookbook [Архівовано 26 грудня 2007 у Wayback Machine.](англ.) — вільно доступна документація Коммон Лісп.
- David B. Lamkins, Successful Lisp: How to Understand and Use Common Lisp [Архівовано 16 грудня 2006 у Wayback Machine.].(англ.)