Топ питань
Часова шкала
Чат
Перспективи

Common Lisp

З Вікіпедії, вільної енциклопедії

Common Lisp
Remove ads

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

Коротка інформація Парадигма, Дата появи ...
Remove ads

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

Remove ads

Типи даних

Узагальнити
Перспектива

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

Множина всіх об'єктів позначається символом t. Порожня множина об'єктів або порожній список позначається символом nil що відповідає логічному «не вірно». Будь-яке інше значення окрім nil вважається логічним «вірно».

  • Числа : в Коммон Лісп є типи даних для цілих будь-якого розміру (обмежується кількістю наявної пам'яті), раціональні числа (утворюються при діленні цілих), числа з рухомою комою, та комплексні числа.
  • Літери : представлення як печатних літер, так символів спеціального призначення.
  • Символи (атоми) : іменовані дані. Кожен символ має список атрибутів, та може містити будь-який об'єкт Ліспа. Можуть використовуватись як змінні або функції.
  • Списки : послідовності, представлені у вигляді зв'язаних комірок консів (cons). Списки утворюються рекурсивно, доданням нового елемента у вже існуючий список створюючи нову cons. cons є об'єктом Лісп, що має два поля: car  може мати будь-яке значення, та cdr  вказівник на попередній cons.
  • Масиви : колекції об'єктів Лісп певної вимірності. В масивах можуть зберігатись будь-які об'єкти Лісп. Існують, для покращення ефективності роботи, масиви, що можуть містити елементи лише певного типу. Одновимірний масив з елементами будь-якого типу має назву вектор, масив літер  рядок, бітів  біт-вектор.
  • Хеш таблиці : надають механізм ефективного зіставлення будь-якого об'єкта (ключ) з іншим об'єктом (значення).
  • Пакети : колекції символів, що використовуються як простори імен.
  • Імена файлів : відповідають іменам файлів у спосіб, максимально не залежний від реалізації файлової системи.
  • Потоки : використовуються для операцій введення/виведення, та для читання інформації із рядків.
  • Випадкові структури : структури даних, що використовуються для збереження інформації про стан вбудованого генератора випадкових чисел.
  • Записи : структури даних, що визначаються користувачем. Записи мають іменовані складові.
  • Умови : використовуються як сигнали для керування порядком роботи програми. Подібні до виключних ситуацій (англ. Exceptions) в деяких мовах програмування.

Крім цих типів даних, CLOS визначає типи даних для класів, методів, загальних методів.

Remove ads

Макроси

Узагальнити
Перспектива

В Коммон Ліспі макроси (англ. 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
Remove ads

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

Узагальнити
Перспектива
Докладніше: CLOS

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

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

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

Реалізації

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

Remove ads

Примітки

Loading content...

Див. також

Посилання

Loading content...
Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads