ЦеНеБлог

Clojure 1.3 (все в одному)

« Ідіть нафіг. Я живу за київським часом | | Маркер групи, або Хто не з нами, того я з'їм »

22 листопада 2011

Clojure 1.3 (все в одному)

Ті, хто програмують на клоӂурі, вже могли чути про зміни, що з'явились в останній версії. Зокрема, замість єдиної бібліотеки clojure.contrib тепер використовуються окремі модулі, розкидані по різних репозиторіях. Важко сказати, в чому переваги такого підходу — економія дискового простору, більша гнучкість розробки... Звичайно, якщо програміст для збирання свого великого й складного проекту використовує lein чи maven, особливої різниці він може й не відчути: в масштабах такого проекту, налаштування залежностей — найлегша частина роботи. Зрештою, може бути так, що для роботи вистачає й основних біліотек clojure, без contrib. Я ж не стільки пишу робочий код, скільки вивчаю й експериментую в REPL (тобто, проектів як таких здебільшого нема — лише маленькі програмки з одного файла) — мені зручніше, коли все необхідне лежить в одному архіві, і я можу спробувати ту чи іншу можливість, не тратячи час на конфігурування та встановлення додаткових пакетів. Власне, ось:

Скачуєте, розпаковуєте. Для запуску — clojure.bat (для тих, хто користується лінуксом, цей варіант не підходить, але, гадаю, аналогічний баш-скрипт написати нескладно). Збірка включає в себе базові бібліотеки clojure та більшість модулів з clojure.contrib , їх можна підключати безпосередньо за допомогою use — якихось додаткових налаштувань за межами програмного коду робити не треба. Може, це й не відповідає філософії справжнього програміста, але мені так зручніше.
30.11.2011 — до збірки додано модуль algo.generic, якого раніше не було в репозиторії.

Коротко про те, як зібрати аналогічний jar своїми руками (якщо вас чимось не влаштовує зроблений мною):

  1. Встановлюємо lein
  2. Робимо lein new clojure-all-in-one
  3. Заходимо в папку, створену попередньою командою, й відкриваємо файл project.clj
  4. Замінюємо список залежностей (номери найсвіжіших версій пакетів можна побачити тут):
    (defproject clojure-all-in-one "1.3.0"
        :description "All the Clojure 1.3 libraries placed in one single jar"
        :dependencies [[org.clojure/clojure "1.3.0"]
            [org.clojure/algo.generic "0.1.0"]

                  [org.clojure/algo.monads "0.1.0"]
            [org.clojure/core.incubator "0.1.0"]
            [org.clojure/core.logic "0.6.5"]
            [org.clojure/core.match "0.2.0-alpha6"]
            [org.clojure/core.unify "0.5.1"]
            [org.clojure/data.codec "0.1.0"]
            [org.clojure/data.csv "0.1.0"]
            [org.clojure/data.finger-tree "0.0.1"]
            [org.clojure/data.json "0.1.2"]
            [org.clojure/data.priority-map "0.0.1"]
            [org.clojure/data.zip "0.1.0"]
            [org.clojure/java.classpath "0.2.0"]
            [org.clojure/java.jdbc "0.1.1"]
            [org.clojure/java.jmx "0.1"]
            [org.clojure/math.combinatorics "0.0.2"]
            [org.clojure/math.numeric-tower "0.0.1"]
            [org.clojure/test.generative "0.1.3"]
            [org.clojure/tools.cli "0.2.1"]
            [org.clojure/tools.logging "0.2.3"]
            [org.clojure/tools.macro "0.1.1"]
            [org.clojure/tools.namespace "0.1.1"]
            [org.clojure/tools.nrepl "0.0.5"]
            [org.clojure/tools.trace "0.7.1"]])

  5. Вміст папок src і test нас не цікавить, тому їх можна очистити від автоматично згенерованих файлів (необов'язково)
  6. Тепер лишається тільки завантажити всі залежності й зібрати їх в один файл. В командному рядку вводимо команду
    lein uberjar
    Якщо все зроблено правильно, система завантажить усі перелічені бібліотеки і збере їх у спільний jar.
  7. Тепер перевірка:
    java -cp clojure-all-in-one-1.3.0-standalone.jar clojure.main
    Якщо все ОК, має з'явитись запрошення:
    Clojure 1.3.0
    user=>

    (якщо замість цього вискочив стек помилок, спробуйте повторити попередні кроки).

Короткий тест:
user=> (use 'clojure.algo.monads)
nil
user=>
(domonad sequence-m
[letters ['a 'b 'c]
numbers [1 2 3]]
[letters numbers])
([a 1] [a 2] [a 3] [b 1] [b 2] [b 3] [c 1] [c 2] [c 3])
user=>
(doc *)
-------------------------
clojure.core/*
([] [x] [x y] [x y & more])
Returns the product of nums. (*) returns 1. Does not auto-promote
longs, will throw on overflow. See also: *'
nil

Автор: Python. Опубліковано 22 листопада 2011 5:29
Змінено 16 грудня 2011 16:39
Категорії: Clojure, Download