Common Lisp (Коммон Лісп) — діалект мови програмування Лісп, визначений стандартом ANSI X3.226-1994. Розроблений з метою стандартизації різних варіантів мови Лісп що існували до появи стандарту. Цей діалект не є реалізацією, а, натомість, лише специфікацією мови програмування.
Common Lisp | |
---|---|
Парадигма | декілька: імперативна, функціональна, об'єктно-орієнтована |
Дата появи | 1984 |
Творці | d, d і d |
Розробник | ANSI |
Останній реліз | X3.226-1994 (1994) |
Система типізації | динамічна типізація[d] і строга типізація |
Під впливом від | Smalltalk, , Лісп |
Операційна система | Cross-platform |
Вебсайт | common-lisp.net |
|
Мова програмування Коммон Лісп реалізує декілька парадигм, зокрема:
- Підтримує імперативну, функціональну та об'єктно-орієнтовану парадигми програмування.
- Динамічна мова програмування, що сприяє пришвидшенню розробки програм шляхом ітеративної компіляції.
- Містить CLOS, об'єктну систему, що підтримує мультиметоди та комбінації методів.
- Може розширюватись через стандартні механізми макросів.
Типи даних
В Коммон Лісп тип даних мають об'єкти, що зберігаються в змінних, а не самі змінні (що відповідає динамічній системі типізації). Кожна змінна може мати як значення будь-який об'єкт Лісп. Задля покращення швидкодії, дозволяється декларувати певні обмеження на можливі типи значень змінних.
Множина всіх об'єктів позначається символом t. Порожня множина об'єктів або порожній список позначається символом nil що відповідає логічному «не вірно». Будь-яке інше значення окрім nil вважається логічним «вірно».
- Числа : в Коммон Лісп є типи даних для цілих будь-якого розміру (обмежується кількістю наявної пам'яті), раціональні числа (утворюються при діленні цілих), числа з рухомою комою, та комплексні числа.
- Літери : представлення як печатних літер, так символів спеціального призначення.
- Символи (атоми) : іменовані дані. Кожен символ має список атрибутів, та може містити будь-який об'єкт Ліспа. Можуть використовуватись як змінні або функції.
- Списки : послідовності, представлені у вигляді зв'язаних комірок консів (cons). Списки утворюються рекурсивно, доданням нового елемента у вже існуючий список створюючи нову cons. cons є об'єктом Лісп, що має два поля: car може мати будь-яке значення, та cdr вказівник на попередній cons.
- Масиви : колекції об'єктів Лісп певної вимірності. В масивах можуть зберігатись будь-які об'єкти Лісп. Існують, для покращення ефективності роботи, масиви, що можуть містити елементи лише певного типу. Одновимірний масив з елементами будь-якого типу має назву вектор, масив літер рядок, бітів біт-вектор.
- Хеш таблиці : надають механізм ефективного зіставлення будь-якого об'єкта (ключ) з іншим об'єктом (значення).
- Пакети : колекції символів, що використовуються як простори імен.
- Імена файлів : відповідають іменам файлів у спосіб, максимально не залежний від реалізації файлової системи.
- Потоки : використовуються для операцій введення/виведення, та для читання інформації із рядків.
- Випадкові структури : структури даних, що використовуються для збереження інформації про стан вбудованого генератора випадкових чисел.
- Записи : структури даних, що визначаються користувачем. Записи мають іменовані складові.
- Умови : використовуються як сигнали для керування порядком роботи програми. Подібні до виключних ситуацій (англ. Exceptions) в деяких мовах програмування.
Крім цих типів даних, CLOS визначає типи даних для класів, методів, загальних методів.
Макроси
В Коммон Ліспі макроси (англ. macro) — це оператори, що реалізуються шляхом перетворення коду. Макрос визначається тим, як буде перетворено код, що його викликає. Перетворення, що ще зветься розкриттям макроса (англ. macro expansion) виконується компілятором автоматично. Як наслідок — код, створений макросом стає такою ж частиною коду, як і введений користувачем код програми.
До типових випадків використання макросів належать:
- нові структури керування порядком виконанням (цикли, відгалуження тощо)
- конструкції області видимості та зв'язування змінних
- спрощення складних фрагментів кодів, що часто повторюються
- визначення форм вищого рівня з побочними ефектами часу компіляції
- програмування кероване даними
- вбудовані предметно-орієнтовані мови програмування (SQL, HTML, Пролог тощо).
Макроси задають макросом defmacro. Спеціальний оператор macrolet дозволяє визначення локальних макросів. Також можливо задавати макроси для символів використанням define-symbol-macro та symbol-macrolet.
Книжка Пола Грехема присвячена докладному розгляду можливостей макросів в Коммон Лісп.
Приклади
Наприклад, наступний макрос визначає оператор 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 є класи, екземпляри класів, загальні функції, та методи.
Загальна функція, це функція, поведінка якої залежить від класів або значень переданих аргументів. Об'єкт загальної функції містить множину методів, лямбда-список, тип комбінування методів, та іншу інформацію. Методи визначають поведінку загальних функцій в залежності від класів переданих аргументів; іншими словами, методи виконують спеціалізацію загальних функцій. Будучи викликаною, загальна функція виконує підмножину власних методів в залежності від класів аргументів. Звичайна функція Коммон Лісп має одне «тіло» (список інструкцій), що завжди виконується при виклику функції. На відміну від звичайних функцій, загальні функції мають множину «тіл», лише підмножина яких виконується під час виклику загальної функції. Обрані «тіла», та спосіб їхньої комбінації залежить від класів параметрів загальної функції та способом комбінування.
Реалізації
Станом на листопад 2007 року, існують такі реалізації специфікації Коммон Лісп, що мали активну підтримку спільноти розробників:
- Allegro CL [ 18 червня 2020 у Wayback Machine.] — комерційна ліцензія, Linux, Unix, Mac, Windows.
- (ABCL) — GPL (з винятком), на Java 1.4 та новіше.
- CMU CL [ 30 жовтня 2005 у Wayback Machine.] (CMUCL) — вільний, Linux, Unix, Mac.
- Clozure CL [ 16 червня 2008 у Wayback Machine.] (OpenMCL) — , 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) — , GPL, Linux, Unix, Mac
- GNU clisp (CLISP) — GPL, Linux, Unix, Mac, Windows.
- LispWorks [ 25 жовтня 2005 у Wayback Machine.] — комерційна ліцензія, Linux, Unix, Mac, Windows.
- (SCL) — комерційна ліцензія, Linux, Unix.
- Steel Bank CL (SBCL) — BSD/Відкрита, Linux, Unix, Mac.
Примітки
- Kent Pitman (1996). . 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.].(англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Common Lisp Kommon Lisp dialekt movi programuvannya Lisp viznachenij standartom ANSI X3 226 1994 Rozroblenij z metoyu standartizaciyi riznih variantiv movi Lisp sho isnuvali do poyavi standartu Cej dialekt ne ye realizaciyeyu a natomist lishe specifikaciyeyu movi programuvannya Common LispParadigma dekilka imperativna funkcionalna ob yektno oriyentovanaData poyavi 1984Tvorci d d i dRozrobnik ANSIOstannij reliz X3 226 1994 1994 Sistema tipizaciyi dinamichna tipizaciya d i stroga tipizaciyaPid vplivom vid Smalltalk LispOperacijna sistema Cross platformVebsajt common lisp net Instrukciyi u Vikipidruchniku Mediafajli u Vikishovishi Mova programuvannya Kommon Lisp realizuye dekilka paradigm zokrema Pidtrimuye imperativnu funkcionalnu ta ob yektno oriyentovanu paradigmi programuvannya Dinamichna mova programuvannya sho spriyaye prishvidshennyu rozrobki program shlyahom iterativnoyi kompilyaciyi Mistit CLOS ob yektnu sistemu sho pidtrimuye multimetodi ta kombinaciyi metodiv Mozhe rozshiryuvatis cherez standartni mehanizmi makrosiv Tipi danihV Kommon Lisp tip danih mayut ob yekti sho zberigayutsya v zminnih a ne sami zminni sho vidpovidaye dinamichnij sistemi tipizaciyi Kozhna zminna mozhe mati yak znachennya bud yakij ob yekt Lisp Zadlya pokrashennya shvidkodiyi dozvolyayetsya deklaruvati pevni obmezhennya na mozhlivi tipi znachen zminnih Mnozhina vsih ob yektiv poznachayetsya simvolom t Porozhnya mnozhina ob yektiv abo porozhnij spisok poznachayetsya simvolom nil sho vidpovidaye logichnomu ne virno Bud yake inshe znachennya okrim nil vvazhayetsya logichnim virno Chisla v Kommon Lisp ye tipi danih dlya cilih bud yakogo rozmiru obmezhuyetsya kilkistyu nayavnoyi pam yati racionalni chisla utvoryuyutsya pri dilenni cilih chisla z ruhomoyu komoyu ta kompleksni chisla Literi predstavlennya yak pechatnih liter tak simvoliv specialnogo priznachennya Simvoli atomi imenovani dani Kozhen simvol maye spisok atributiv ta mozhe mistiti bud yakij ob yekt Lispa Mozhut vikoristovuvatis yak zminni abo funkciyi Spiski poslidovnosti predstavleni u viglyadi zv yazanih komirok konsiv cons Spiski utvoryuyutsya rekursivno dodannyam novogo elementa u vzhe isnuyuchij spisok stvoryuyuchi novu cons cons ye ob yektom Lisp sho maye dva polya car mozhe mati bud yake znachennya ta cdr vkazivnik na poperednij cons Masivi kolekciyi ob yektiv Lisp pevnoyi vimirnosti V masivah mozhut zberigatis bud yaki ob yekti Lisp Isnuyut dlya pokrashennya efektivnosti roboti masivi sho mozhut mistiti elementi lishe pevnogo tipu Odnovimirnij masiv z elementami bud yakogo tipu maye nazvu vektor masiv liter ryadok bitiv bit vektor Hesh tablici nadayut mehanizm efektivnogo zistavlennya bud yakogo ob yekta klyuch z inshim ob yektom znachennya Paketi kolekciyi simvoliv sho vikoristovuyutsya yak prostori imen Imena fajliv vidpovidayut imenam fajliv u sposib maksimalno ne zalezhnij vid realizaciyi fajlovoyi sistemi Potoki vikoristovuyutsya dlya operacij vvedennya vivedennya ta dlya chitannya informaciyi iz ryadkiv Vipadkovi strukturi strukturi danih sho vikoristovuyutsya dlya zberezhennya informaciyi pro stan vbudovanogo generatora vipadkovih chisel Zapisi strukturi danih sho viznachayutsya koristuvachem Zapisi mayut imenovani skladovi Umovi vikoristovuyutsya yak signali dlya keruvannya poryadkom roboti programi Podibni do viklyuchnih situacij angl Exceptions v deyakih movah programuvannya Krim cih tipiv danih CLOS viznachaye tipi danih dlya klasiv metodiv zagalnih metodiv MakrosiV Kommon Lispi makrosi angl macro ce operatori sho realizuyutsya shlyahom peretvorennya kodu Makros viznachayetsya tim yak bude peretvoreno kod sho jogo viklikaye Peretvorennya sho she zvetsya rozkrittyam makrosa angl macro expansion vikonuyetsya kompilyatorom avtomatichno Yak naslidok kod stvorenij makrosom staye takoyu zh chastinoyu kodu yak i vvedenij koristuvachem kod programi Do tipovih vipadkiv vikoristannya makrosiv nalezhat novi strukturi keruvannya poryadkom vikonannyam cikli vidgaluzhennya tosho konstrukciyi oblasti vidimosti ta zv yazuvannya zminnih sproshennya skladnih fragmentiv kodiv sho chasto povtoryuyutsya viznachennya form vishogo rivnya z pobochnimi efektami chasu kompilyaciyi programuvannya kerovane danimi vbudovani predmetno oriyentovani movi programuvannya SQL HTML Prolog tosho Makrosi zadayut makrosom defmacro Specialnij operator macrolet dozvolyaye viznachennya lokalnih makrosiv Takozh mozhlivo zadavati makrosi dlya simvoliv vikoristannyam define symbol macro ta symbol macrolet Knizhka Pola Grehema prisvyachena dokladnomu rozglyadu mozhlivostej makrosiv v Kommon Lisp Prikladi Napriklad nastupnij makros viznachaye operator aif sho otrimuye dvi abo tri formi obchislyuye znachennya pershoyi zapam yatovuye jogo v zminnij it ta u vipadku yaksho znachennya istina t vikonuye drugu formu a yaksho znachennya ne istina i zadana tretya forma to tretyu tak zvane anaforichne yaksho defmacro aif test then amp optional else let it test if it then else Pri comu zapam yatovane u zminnij it znachennya pershoyi formi dostupne pid chas vikonannya oboh nastupnih aif trivale ta skladne obchislennya print it sho vidpovidaye nastupnomu psevdokodu pre it trivale ta skladne obchislennya if it then print it pre Ob yektno oriyentovane programuvannyaDokladnishe CLOS Ob yektna sistema Kommon Lispa CLOS ye rozshirennyam Kommon Lispa sho dodaye pidtrimku mozhlivostej ob yektno oriyentovanogo programuvannya v Kommon Lisp V osnovi cogo rozshirennya znahodyatsya zagalni funkciyi mnozhinne uspadkuvannya deklarativne kombinuvannya metodiv ta meta ob yektnij protokol Fundamentalnimi ob yektami CLOS ye klasi ekzemplyari klasiv zagalni funkciyi ta metodi Zagalna funkciya ce funkciya povedinka yakoyi zalezhit vid klasiv abo znachen peredanih argumentiv Ob yekt zagalnoyi funkciyi mistit mnozhinu metodiv lyambda spisok tip kombinuvannya metodiv ta inshu informaciyu Metodi viznachayut povedinku zagalnih funkcij v zalezhnosti vid klasiv peredanih argumentiv inshimi slovami metodi vikonuyut specializaciyu zagalnih funkcij Buduchi viklikanoyu zagalna funkciya vikonuye pidmnozhinu vlasnih metodiv v zalezhnosti vid klasiv argumentiv Zvichajna funkciya Kommon Lisp maye odne tilo spisok instrukcij sho zavzhdi vikonuyetsya pri vikliku funkciyi Na vidminu vid zvichajnih funkcij zagalni funkciyi mayut mnozhinu til lishe pidmnozhina yakih vikonuyetsya pid chas vikliku zagalnoyi funkciyi Obrani tila ta sposib yihnoyi kombinaciyi zalezhit vid klasiv parametriv zagalnoyi funkciyi ta sposobom kombinuvannya RealizaciyiStanom na listopad 2007 roku isnuyut taki realizaciyi specifikaciyi Kommon Lisp sho mali aktivnu pidtrimku spilnoti rozrobnikiv Allegro CL 18 chervnya 2020 u Wayback Machine komercijna licenziya Linux Unix Mac Windows ABCL GPL z vinyatkom na Java 1 4 ta novishe CMU CL 30 zhovtnya 2005 u Wayback Machine CMUCL vilnij Linux Unix Mac Clozure CL 16 chervnya 2008 u Wayback Machine OpenMCL Linux Unix Mac Corman CL 25 zhovtnya 2005 u Wayback Machine komercijna licenziya Windows Embedded CL 26 grudnya 2007 u Wayback Machine ECL LGPL Linux Unix Mac Windows GNU CL 6 bereznya 2008 u Wayback Machine GCL GPL Linux Unix Mac GNU clisp CLISP GPL Linux Unix Mac Windows LispWorks 25 zhovtnya 2005 u Wayback Machine komercijna licenziya Linux Unix Mac Windows SCL komercijna licenziya Linux Unix Steel Bank CL SBCL BSD Vidkrita Linux Unix Mac PrimitkiKent Pitman 1996 The Harlequin Group Limited Arhiv originalu za 5 serpnya 2002 Procitovano 26 grudnya 2007 Paul Graham ANSI Common Lisp Prentice Hall 1996 Guy L Steele Jr Common Lisp the Language vid 2 ge 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 kvitnya 2012 u Wayback Machine version 2 Div takozhVikipidruchnik maye knigu na temu Mova programuvannya Lisp Scheme she odin populyarnij dialekt movi programuvannya Lisp Lyambda chislennyaPosilannyaCommon Lisp katalog posilan Open Directory Project Association of Lisp Users 28 kvitnya 2021 u Wayback Machine angl asociaciya koristuvachiv Lisp Common Lisp Wiki 5 kvitnya 2022 u Wayback Machine angl Viki prisvyachena Kommon Lisp Pidruchniki Peter Seibel Practical Common Lisp 29 lipnya 2005 u Wayback Machine angl vilno dostupnij pidruchnik z Kommon Lisp The Common Lisp Cookbook 26 grudnya 2007 u Wayback Machine angl vilno dostupna dokumentaciya Kommon Lisp David B Lamkins Successful Lisp How to Understand and Use Common Lisp 16 grudnya 2006 u Wayback Machine angl