Clojure (вимовляється приблизно кложер, так само як англ. closure — Замикання) — сучасний діалект мови програмування Lisp. Це мова загального призначення, що підтримує інтерактивну розробку, зорієнтовану на функціональне програмування, спрощує багатопотокове програмування, та містить риси сучасних скриптових мов.
Clojure | |
---|---|
Парадигма | функціональна, |
Дата появи | 2007 |
Творці | Rich Hickey |
Розробник | Річард Хіккі |
Останній реліз | 1.11.1 (5 квітня 2022 ) |
Система типізації | динамічна типізація, сувора типізація |
Під впливом від | Common Lisp, Scheme, Prolog, ML, Haskell, Erlang |
Мова реалізації | Java[2] |
Платформа | JVM, CLR |
Ліцензія | |
Звичайні розширення файлів | .clj , .cljs , .cljc , .edn або .cljr |
Репозиторій вихідного коду | github.com/clojure/clojure |
Вебсайт | Офіційний сайт |
|
Clojure працює на Java Virtual Machine і Common Language Runtime. Як і інші Lisp-подібні мови, Clojure розглядає і має потужну систему макросів.
Вихідний код компілятора Clojure, бібліотек і -компонентів розповсюджується в рамках ліцензії .
Філософія
Річард Гіккі розробив Clojure, оскільки йому був потрібен сучасний Lisp для функціонального програмування, розрахований на інтеграцію з розповсюдженою платформою Java й розроблений для паралельного програмування.
Підхід Clojure до паралельності характеризується концепцією тотожностей, що представляють серію незмінних станів протягом часу. Оскільки стани є незмінними значеннями, будь-яка кількість обробників може паралельно обробляти їх, і конкуренція зводиться до питання керування змінами від одного стану до іншого. З цією метою, Clojure надає декілька типів змінюваних посилань, кожен з яких має добре визначену семантику переходу між станами.
Синтаксис
Як і інші Lisp-подібні мови, синтаксис Clojure побудовано на S-виразах (англ. S-expression), які в процесі синтаксичного розбору спершу перетворюються на структури даних за допомогою функції-читача (англ. reader), перш ніж компілюються. Clojure's reader підтримує літеральний синтаксис для хеш-таблиць, множин та векторів на додаток до списків, і вони передаються компілятору як є. Іншими словами, компілятор Clojure компілює не лише спискові структури даних, але й безпосередньо підтримує всі названі вище типи. Clojure — , і не є сумісним за кодом з іншими діалектами мови Lisp.
Макроси
Clojure дуже схожа на використовувану в Common Lisp, з тією відмінністю, що версія синтаксичного цитування Clojure (з використанням знаку `) доповнює символи їхніми просторами імен. Це допомагає запобігти ненавмисному перехопленню імен, оскільки прив'язка до імен, доповнених простором імен, заборонена. Є можливість форсувати таке захоплення імен, але це має бути зроблено явно. Clojure також не дозволяє переприв'язку глобальних імен з інших просторів імен, які були імпортовані в поточний простір.
Можливості мови
- Компільована мова, що генерує байткод для JVM
- Тісна інтеграція з Java: відкомпільовані в байткод JVM, програми на Clojure можуть пакуватися та запускатися на JVM-серверах без додаткових ускладнень. Мова також надає макроси, які полегшують використання наявного Java API. Всі структури даних Clojure реалізують стандартні інтерфейси Java, що робить простим запуск Java коду, розробленого на Clojure.
- Динамічна розробка з використанням REPL
- Функції як
- Наголос на рекурсії замість циклів з побічним ефектом
- Ліниві послідовності
- Надає широкий набір незмінюваних персистентних структур даних
- Паралельне програмування з використанням програмної транзакційної пам'яті, система агентів, система динамічних змінних
- Мультиметоди (аналог перевантаження (англ. overloading) функцій), що підтримують динамічний вибір методу за типами та значеннями довільного набору аргументів (пор. звичайний об'єктноорієнтований поліморфізм, де вибір здійснюється за типом (фактично) першого аргументу)
Варіанти
Реалізації Clojure для відмінних від JVM платформ:
- ClojureCLR,
- ClojureScript,
- las3r,
- clojure-py,
- rouge,
Приклади
(println "Привіт, світе!")
Hello World з графічним інтерфейсом користувача:
(javax.swing.JOptionPane/showMessageDialog nil "Привіт, світе!" )
Thread-безпечний генератор унікальних серійних номерів:
(let [i (atom 0)] (defn generate-unique-id "Повертає унікальний числовий ID при кожному виклику." [] (swap! i inc)))
Анонімний субклас java.io.Writer
, що не пише нікуди, і макрос, що використовує це для відключення друку в своїх межах:
(def bit-bucket-writer (proxy [java.io.Writer] [] (write [buf] nil) (close [] nil) (flush [] nil))) (defmacro noprint "Обчислює задані вирази з відключеним друком в *out*." [& forms] `(binding [*out* bit-bucket-writer] ~@forms)) (noprint (println "Привіт, ніхто!"))
10 тредів, що маніпулюють однією спільною структурою даних, яка складається з 100 векторів, кожен з яких містить 10 (початково послідовних) унікальних чисел. Кожен тред багато разів обирає дві випадкові позиції у двох випадкових векторах і обмінює їх. Усі зміни векторів відбуваються в транзакціях шляхом використання системи програмної пам'яті транзакцій Clojure. Ось чому навіть після 100 000 ітерацій кожного треда жодне число не втрачено.
(defn run [nvecs nitems nthreads niters] (let [vec-refs (vec (map (comp ref vec) (partition nitems (range (* nvecs nitems))))) swap #(let [v1 (rand-int nvecs) v2 (rand-int nvecs) i1 (rand-int nitems) i2 (rand-int nitems)] (dosync (let [temp (nth @(vec-refs v1) i1)] (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2)) (alter (vec-refs v2) assoc i2 temp)))) report #(do (prn (map deref vec-refs)) (println "Distinct:" (count (distinct (apply concat (map deref vec-refs))))))] (report) (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap))))) (report))) (run 100 10 10 100000)
Вивід попереднього прикладу:
([0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19] ... [990 991 992 993 994 995 996 997 998 999]) Distinct: 1000 ([382 318 466 963 619 22 21 273 45 596] [808 639 804 471 394 904 952 75 289 778] ... [484 216 622 139 651 592 379 228 242 355]) Distinct: 1000
Ханойська вежа. Функція, що генерує розв'язок задачі у вигляді лінивої послідовності, та форматований вивід результату:
(defn lazy-hanoi [n a b c] (lazy-seq (when-not (zero? n) (lazy-cat (lazy-hanoi (dec n) a c b) [[a b]] (lazy-hanoi (dec n) c b a))))) (defn print-hanoi [n a b c] (doseq [[from to] (lazy-hanoi n a b c)] (printf "%s -> %s;\t" from to)))
Макрос, що здійснює обмін двох глобальних змінних. При кожному виклику макроса замість temp# підставляється новий унікальний ідентифікатор.
(defmacro swap [a b] `(do (def temp# ~a) (def ~a ~b) (def ~b temp#)))
Відмінності від інших діалектів Lisp
- Clojure — мова, чутлива до регістру символів
- Clojure — Lisp-1 (для змінних та функцій використовується спільний простір імен — так само як у Scheme, але не в Common Lisp)
- () — не те ж саме, що й nil
- Рідер вільний від побічної дії.
- Ключові слова не є символами.
- Символи не є місцем зберігання даних (див. змінні).
- nil — не символ.
- t нема у синтаксисі, його функцію виконує true
- Таблиця читання зараз[] недоступна для користувацьких програм.
- let здійснює зв'язування послідовно.
- do — не оператор циклу
- Хвостова рекурсія не підтримується, для її заміни можна використати recur (якщо процедура викликає сама себе) чи trampoline (якщо декілька процедур викликають одна одну).
- recur являє собою перехід на початок процедури чи циклу з присвоєнням нових значень параметрів. Обов'язково має бути у «хвостовій» позиції, що контролюється транслятором.
- trampoline — функція, що забезпечує взаємний виклик функцій без переповнення стеку. Функції, що взаємодіють через trampoline, не викликають одна одну безпосередньо, а повертають функцію-замикання, що містить виклик. Якщо результатом функції є функція, trampoline викликає її, повторює цикл вже з її результатом і т. д., якщо ж результат має інший тип, trampoline завершує роботу і повертає його.
- Синтаксичне цитування (syntax-quote, оператор `) здійснює розв'язку символів, доповнюючи їх просторами імен, тому `x — не те ж саме, що 'x.
- Синтаксичні цитати дозволяють автоматично генерувати символи.
- ~ (тильда) — розцитовування (unquote), тоді як ',' (кома) вважається пробілом.
- Існує синтаксис на рівні рідера для асоціативних таблиць (maps), множин та векторів.
- cons, first та rest маніпулюють з абстракцією послідовності, необов'язково з елементами cons.
- Більшість структур даних — незмінювані.
- Замість lambda використовується fn, що може мати декілька методів.
- = — предикат рівності (equality), що може порівнювати не лише числа, а й інші об'єкти.
- Всі (глобальні) змінні можна динамічно переприв'язувати без конфлікту з лексичними локальними прив'язками. Спеціальні оголошення для розрізнення динамічних та лексичних прив'язок — не потрібні . Оскільки Clojure — Lisp-1, (глобальні) функції можуть динамічно переприв'язуватись (перевизначатись).
- Нема letrec, labels чи flet — для посилання на себе використовується (fn ім'я [аргументи]…), для взаємних посилань — letfn.
- У Clojure nil позначає відсутність значення будь-якого типу і не прив'язаний до списків чи послідовностей.
- Порожні колекції не є еквівалентом nil. Clojure не прирівнює nil до '().
- false — одне з двох можливих булевих значень, інше — true
- Серед колекцій є не лише списки. Можуть існувати порожні колекції, деякі з них підтримуються літералами ([], {} та ()). Тому не може бути якогось сторожового значення порожньої колекції.
- Порівнюючи зі Scheme, nil можна розглядати як аналог #f.
- Найбільша відмінність Clojure — послідовності. Це не якийсь окремий тип колекцій, особливо враховуючи, що їм необов'язково бути саме списками. При спробі отримати з порожньої колекції послідовність її елементів (викликом seq) повертається nil. При спробі отримати з послідовності (на її останньому елементі) залишок (rest) буде повернуто іншу логічну послідовність. Перевірити, чи ця послідовність порожня, можна шляхом виклику seq. Це дозволяє послідовностям та протоколу послідовностей бути лінивими.
- Деякі функції для роботи з послідовностями відповідають функціям зі Scheme та CL, що маніпулюють лише з парами/cons ('списками') і повертають сторожове значення ('() або nil), яке представляє 'порожній' список. Їх результат у Clojure відрізняється тим, що повертається не специфічна порожня колекція, а інша логічна послідовність. Частина функцій для роботи з послідовностями не мають відповідників у Scheme/CL і являють собою Haskell/ML-подібні функції. Деякі з них повертають нескінченні або обчислювані послідовності, де аналогія з конкретними структурами даних, такими як списки у Scheme/CL, лише приблизна.
- Це допомагає відокремити колекції/структури даних від послідовностей/ітерацій. Як у CL, так і у Scheme вони об'єднані, у Clojure — відокремлені.
Примітки
- Rich Hickey (30 червня 2009). Books that influenced Clojure. Архів оригіналу за 18 квітня 2012. Процитовано 11 вересня 2009.
- The clojure Open Source Project on Open Hub: Languages Page — 2006.
- Rationale. Rich Hickey. clojure.org. Архів оригіналу за 18 квітня 2012. Процитовано 17 жовтня 2008.
- . Архів оригіналу за 9 листопада 2017. Процитовано 1 березня 2011.
{{}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title () - On State and Identity. Rich Hickey. clojure.org. Архів оригіналу за 12 липня 2013. Процитовано 1 березня 2010.
- . Github.com. Архів оригіналу за 25 серпня 2013. Процитовано 28 червня 2012.
- . Github.com. Архів оригіналу за 18 травня 2014. Процитовано 28 червня 2012.
- aemoncannon (30 грудня 2010). . Github.com. Архів оригіналу за 2 січня 2015. Процитовано 28 червня 2012.
- . Github.com. Архів оригіналу за 23 січня 2016. Процитовано 10 липня 2012.
- rouge-lang/rouge · GitHub. Github.com. Процитовано 25 січня 2013.[недоступне посилання з лютого 2019]
Література
- Halloway, Stuart (21 травня 2009), Programming Clojure (вид. 1st), , с. 304, ISBN
- VanderHart, Luke; Sierra, Stuart (7 червня 2010), (вид. 1st), Apress, с. 232, ISBN , архів оригіналу за 17 вересня 2010, процитовано 1 березня 2011
- Fogus, Michael; Houser, Chris (28 грудня 2010), (вид. 1st), , с. 300, ISBN , архів оригіналу за 4 січня 2011, процитовано 1 березня 2011
- Rathore, Amit (28 березня 2011), (вид. 1st), , с. 475, ISBN , архів оригіналу за 11 березня 2011, процитовано 1 березня 2011
Посилання
Вікіпідручник має книгу на тему Clojure Programming |
- Офіційний сайт
- GitHub code repository for Clojure [ 5 жовтня 2010 у Wayback Machine.]
- A comprehensive overview of Clojure [ 28 червня 2011 у Wayback Machine.]
- An overview of Clojure 1.2 in reference format [ 28 квітня 2017 у Wayback Machine.]
- Full Disclojure — Screencast [ 27 листопада 2011 у Wayback Machine.]
- clojuredocs.org — Community-powered documentation and examples [ 7 серпня 2011 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Clojure vimovlyayetsya priblizno klozher tak samo yak angl closure Zamikannya suchasnij dialekt movi programuvannya Lisp Ce mova zagalnogo priznachennya sho pidtrimuye interaktivnu rozrobku zoriyentovanu na funkcionalne programuvannya sproshuye bagatopotokove programuvannya ta mistit risi suchasnih skriptovih mov ClojureParadigma funkcionalna Data poyavi 2007Tvorci Rich HickeyRozrobnik Richard HikkiOstannij reliz 1 11 1 5 kvitnya 2022 2 roki tomu 2022 04 05 Sistema tipizaciyi dinamichna tipizaciya suvora tipizaciyaPid vplivom vid Common Lisp Scheme Prolog ML Haskell ErlangMova realizaciyi Java 2 Platforma JVM CLRLicenziyaZvichajni rozshirennya fajliv clj cljs cljc edn abo cljrRepozitorij vihidnogo kodu github com clojure clojureVebsajt Oficijnij sajt Mediafajli u Vikishovishi Clojure pracyuye na Java Virtual Machine i Common Language Runtime Yak i inshi Lisp podibni movi Clojure rozglyadaye i maye potuzhnu sistemu makrosiv Vihidnij kod kompilyatora Clojure bibliotek i komponentiv rozpovsyudzhuyetsya v ramkah licenziyi FilosofiyaRichard Gikki rozrobiv Clojure oskilki jomu buv potriben suchasnij Lisp dlya funkcionalnogo programuvannya rozrahovanij na integraciyu z rozpovsyudzhenoyu platformoyu Java j rozroblenij dlya paralelnogo programuvannya Pidhid Clojure do paralelnosti harakterizuyetsya koncepciyeyu totozhnostej sho predstavlyayut seriyu nezminnih staniv protyagom chasu Oskilki stani ye nezminnimi znachennyami bud yaka kilkist obrobnikiv mozhe paralelno obroblyati yih i konkurenciya zvoditsya do pitannya keruvannya zminami vid odnogo stanu do inshogo Z ciyeyu metoyu Clojure nadaye dekilka tipiv zminyuvanih posilan kozhen z yakih maye dobre viznachenu semantiku perehodu mizh stanami SintaksisYak i inshi Lisp podibni movi sintaksis Clojure pobudovano na S virazah angl S expression yaki v procesi sintaksichnogo rozboru spershu peretvoryuyutsya na strukturi danih za dopomogoyu funkciyi chitacha angl reader persh nizh kompilyuyutsya Clojure s reader pidtrimuye literalnij sintaksis dlya hesh tablic mnozhin ta vektoriv na dodatok do spiskiv i voni peredayutsya kompilyatoru yak ye Inshimi slovami kompilyator Clojure kompilyuye ne lishe spiskovi strukturi danih ale j bezposeredno pidtrimuye vsi nazvani vishe tipi Clojure i ne ye sumisnim za kodom z inshimi dialektami movi Lisp MakrosiClojure duzhe shozha na vikoristovuvanu v Common Lisp z tiyeyu vidminnistyu sho versiya sintaksichnogo cituvannya Clojure z vikoristannyam znaku dopovnyuye simvoli yihnimi prostorami imen Ce dopomagaye zapobigti nenavmisnomu perehoplennyu imen oskilki priv yazka do imen dopovnenih prostorom imen zaboronena Ye mozhlivist forsuvati take zahoplennya imen ale ce maye buti zrobleno yavno Clojure takozh ne dozvolyaye perepriv yazku globalnih imen z inshih prostoriv imen yaki buli importovani v potochnij prostir Mozhlivosti moviKompilovana mova sho generuye bajtkod dlya JVM Tisna integraciya z Java vidkompilovani v bajtkod JVM programi na Clojure mozhut pakuvatisya ta zapuskatisya na JVM serverah bez dodatkovih uskladnen Mova takozh nadaye makrosi yaki polegshuyut vikoristannya nayavnogo Java API Vsi strukturi danih Clojure realizuyut standartni interfejsi Java sho robit prostim zapusk Java kodu rozroblenogo na Clojure Dinamichna rozrobka z vikoristannyam REPL Funkciyi yak Nagolos na rekursiyi zamist cikliv z pobichnim efektom Linivi poslidovnosti Nadaye shirokij nabir nezminyuvanih persistentnih struktur danih Paralelne programuvannya z vikoristannyam programnoyi tranzakcijnoyi pam yati sistema agentiv sistema dinamichnih zminnih Multimetodi analog perevantazhennya angl overloading funkcij sho pidtrimuyut dinamichnij vibir metodu za tipami ta znachennyami dovilnogo naboru argumentiv por zvichajnij ob yektnooriyentovanij polimorfizm de vibir zdijsnyuyetsya za tipom faktichno pershogo argumentu VariantiRealizaciyi Clojure dlya vidminnih vid JVM platform ClojureCLR ClojureScript las3r clojure py rouge PrikladiHello world println Privit svite Hello World z grafichnim interfejsom koristuvacha javax swing JOptionPane showMessageDialog nil Privit svite Thread bezpechnij generator unikalnih serijnih nomeriv let i atom 0 defn generate unique id Povertaye unikalnij chislovij ID pri kozhnomu vikliku swap i inc Anonimnij subklas a rel nofollow class external text href http java sun com javase 6 docs api java io Writer html java io Writer a sho ne pishe nikudi i makros sho vikoristovuye ce dlya vidklyuchennya druku v svoyih mezhah def bit bucket writer proxy java io Writer write buf nil close nil flush nil defmacro noprint Obchislyuye zadani virazi z vidklyuchenim drukom v out amp forms binding out bit bucket writer forms noprint println Privit nihto 10 trediv sho manipulyuyut odniyeyu spilnoyu strukturoyu danih yaka skladayetsya z 100 vektoriv kozhen z yakih mistit 10 pochatkovo poslidovnih unikalnih chisel Kozhen tred bagato raziv obiraye dvi vipadkovi poziciyi u dvoh vipadkovih vektorah i obminyuye yih Usi zmini vektoriv vidbuvayutsya v tranzakciyah shlyahom vikoristannya sistemi programnoyi pam yati tranzakcij Clojure Os chomu navit pislya 100 000 iteracij kozhnogo treda zhodne chislo ne vtracheno defn run nvecs nitems nthreads niters let vec refs vec map comp ref vec partition nitems range nvecs nitems swap let v1 rand int nvecs v2 rand int nvecs i1 rand int nitems i2 rand int nitems dosync let temp nth vec refs v1 i1 alter vec refs v1 assoc i1 nth vec refs v2 i2 alter vec refs v2 assoc i2 temp report do prn map deref vec refs println Distinct count distinct apply concat map deref vec refs report dorun apply pcalls repeat nthreads dotimes niters swap report run 100 10 10 100000 Vivid poperednogo prikladu 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 990 991 992 993 994 995 996 997 998 999 Distinct 1000 382 318 466 963 619 22 21 273 45 596 808 639 804 471 394 904 952 75 289 778 484 216 622 139 651 592 379 228 242 355 Distinct 1000 Hanojska vezha Funkciya sho generuye rozv yazok zadachi u viglyadi linivoyi poslidovnosti ta formatovanij vivid rezultatu defn lazy hanoi n a b c lazy seq when not zero n lazy cat lazy hanoi dec n a c b a b lazy hanoi dec n c b a defn print hanoi n a b c doseq from to lazy hanoi n a b c printf s gt s t from to Makros sho zdijsnyuye obmin dvoh globalnih zminnih Pri kozhnomu vikliku makrosa zamist temp pidstavlyayetsya novij unikalnij identifikator defmacro swap a b do def temp a def a b def b temp Vidminnosti vid inshih dialektiv LispClojure mova chutliva do registru simvoliv Clojure Lisp 1 dlya zminnih ta funkcij vikoristovuyetsya spilnij prostir imen tak samo yak u Scheme ale ne v Common Lisp ne te zh same sho j nil Rider vilnij vid pobichnoyi diyi Klyuchovi slova ne ye simvolami Simvoli ne ye miscem zberigannya danih div zminni nil ne simvol t nema u sintaksisi jogo funkciyu vikonuye true Tablicya chitannya zaraz koli nedostupna dlya koristuvackih program let zdijsnyuye zv yazuvannya poslidovno do ne operator ciklu Hvostova rekursiya ne pidtrimuyetsya dlya yiyi zamini mozhna vikoristati recur yaksho procedura viklikaye sama sebe chi trampoline yaksho dekilka procedur viklikayut odna odnu recur yavlyaye soboyu perehid na pochatok proceduri chi ciklu z prisvoyennyam novih znachen parametriv Obov yazkovo maye buti u hvostovij poziciyi sho kontrolyuyetsya translyatorom trampoline funkciya sho zabezpechuye vzayemnij viklik funkcij bez perepovnennya steku Funkciyi sho vzayemodiyut cherez trampoline ne viklikayut odna odnu bezposeredno a povertayut funkciyu zamikannya sho mistit viklik Yaksho rezultatom funkciyi ye funkciya trampoline viklikaye yiyi povtoryuye cikl vzhe z yiyi rezultatom i t d yaksho zh rezultat maye inshij tip trampoline zavershuye robotu i povertaye jogo Sintaksichne cituvannya syntax quote operator zdijsnyuye rozv yazku simvoliv dopovnyuyuchi yih prostorami imen tomu x ne te zh same sho x Sintaksichni citati dozvolyayut avtomatichno generuvati simvoli tilda rozcitovuvannya unquote todi yak koma vvazhayetsya probilom Isnuye sintaksis na rivni ridera dlya asociativnih tablic maps mnozhin ta vektoriv cons first ta rest manipulyuyut z abstrakciyeyu poslidovnosti neobov yazkovo z elementami cons Bilshist struktur danih nezminyuvani Zamist lambda vikoristovuyetsya fn sho mozhe mati dekilka metodiv predikat rivnosti equality sho mozhe porivnyuvati ne lishe chisla a j inshi ob yekti Vsi globalni zminni mozhna dinamichno perepriv yazuvati bez konfliktu z leksichnimi lokalnimi priv yazkami Specialni ogoloshennya dlya rozriznennya dinamichnih ta leksichnih priv yazok ne potribni Oskilki Clojure Lisp 1 globalni funkciyi mozhut dinamichno perepriv yazuvatis pereviznachatis Nema letrec labels chi flet dlya posilannya na sebe vikoristovuyetsya fn im ya argumenti dlya vzayemnih posilan letfn U Clojure nil poznachaye vidsutnist znachennya bud yakogo tipu i ne priv yazanij do spiskiv chi poslidovnostej Porozhni kolekciyi ne ye ekvivalentom nil Clojure ne pririvnyuye nil do false odne z dvoh mozhlivih bulevih znachen inshe true Sered kolekcij ye ne lishe spiski Mozhut isnuvati porozhni kolekciyi deyaki z nih pidtrimuyutsya literalami ta Tomu ne mozhe buti yakogos storozhovogo znachennya porozhnoyi kolekciyi Porivnyuyuchi zi Scheme nil mozhna rozglyadati yak analog f Najbilsha vidminnist Clojure poslidovnosti Ce ne yakijs okremij tip kolekcij osoblivo vrahovuyuchi sho yim neobov yazkovo buti same spiskami Pri sprobi otrimati z porozhnoyi kolekciyi poslidovnist yiyi elementiv viklikom seq povertayetsya nil Pri sprobi otrimati z poslidovnosti na yiyi ostannomu elementi zalishok rest bude povernuto inshu logichnu poslidovnist Pereviriti chi cya poslidovnist porozhnya mozhna shlyahom vikliku seq Ce dozvolyaye poslidovnostyam ta protokolu poslidovnostej buti linivimi Deyaki funkciyi dlya roboti z poslidovnostyami vidpovidayut funkciyam zi Scheme ta CL sho manipulyuyut lishe z parami cons spiskami i povertayut storozhove znachennya abo nil yake predstavlyaye porozhnij spisok Yih rezultat u Clojure vidriznyayetsya tim sho povertayetsya ne specifichna porozhnya kolekciya a insha logichna poslidovnist Chastina funkcij dlya roboti z poslidovnostyami ne mayut vidpovidnikiv u Scheme CL i yavlyayut soboyu Haskell ML podibni funkciyi Deyaki z nih povertayut neskinchenni abo obchislyuvani poslidovnosti de analogiya z konkretnimi strukturami danih takimi yak spiski u Scheme CL lishe priblizna Ce dopomagaye vidokremiti kolekciyi strukturi danih vid poslidovnostej iteracij Yak u CL tak i u Scheme voni ob yednani u Clojure vidokremleni PrimitkiRich Hickey 30 chervnya 2009 Books that influenced Clojure Arhiv originalu za 18 kvitnya 2012 Procitovano 11 veresnya 2009 The clojure Open Source Project on Open Hub Languages Page 2006 d Track Q124688 Rationale Rich Hickey clojure org Arhiv originalu za 18 kvitnya 2012 Procitovano 17 zhovtnya 2008 Arhiv originalu za 9 listopada 2017 Procitovano 1 bereznya 2011 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z tekstom archived copy yak znachennya parametru title posilannya On State and Identity Rich Hickey clojure org Arhiv originalu za 12 lipnya 2013 Procitovano 1 bereznya 2010 Github com Arhiv originalu za 25 serpnya 2013 Procitovano 28 chervnya 2012 Github com Arhiv originalu za 18 travnya 2014 Procitovano 28 chervnya 2012 aemoncannon 30 grudnya 2010 Github com Arhiv originalu za 2 sichnya 2015 Procitovano 28 chervnya 2012 Github com Arhiv originalu za 23 sichnya 2016 Procitovano 10 lipnya 2012 rouge lang rouge GitHub Github com Procitovano 25 sichnya 2013 nedostupne posilannya z lyutogo 2019 LiteraturaHalloway Stuart 21 travnya 2009 Programming Clojure vid 1st s 304 ISBN 1934356336 VanderHart Luke Sierra Stuart 7 chervnya 2010 vid 1st Apress s 232 ISBN 1430272317 arhiv originalu za 17 veresnya 2010 procitovano 1 bereznya 2011 Fogus Michael Houser Chris 28 grudnya 2010 vid 1st s 300 ISBN 1935182641 arhiv originalu za 4 sichnya 2011 procitovano 1 bereznya 2011 Rathore Amit 28 bereznya 2011 vid 1st s 475 ISBN 1935182595 arhiv originalu za 11 bereznya 2011 procitovano 1 bereznya 2011PosilannyaVikipidruchnik maye knigu na temu Clojure ProgrammingOficijnij sajt GitHub code repository for Clojure 5 zhovtnya 2010 u Wayback Machine A comprehensive overview of Clojure 28 chervnya 2011 u Wayback Machine An overview of Clojure 1 2 in reference format 28 kvitnya 2017 u Wayback Machine Full Disclojure Screencast 27 listopada 2011 u Wayback Machine clojuredocs org Community powered documentation and examples 7 serpnya 2011 u Wayback Machine