Clojure: любовь с первого взгляда!

clojure-love-from-the-first-sightНесколько лет назад я узнал о Функциональном программировании. С тех пор, в большей или меньшей степени, мне встречались разрозненные описания идей этой парадигмы. И чем больше я узнавал, тем сильнее хотелось поближе с ними познакомиться. Интриговало многое: отсутствие состояния, чистые функции, возможность кэширования результата функции, параллельные вычисления. Как заядлому императивному программисту, довольно сложно представить как можно обойтись без сохранения состояния в обыденной жизни. Так или иначе, я стал посматривать в сторону функциональных языков. Бегло посмотрев на Haskell, Lisp (Scheme) и Clojure, взгляд остановился на последнем. Уж не знаю, то ли логотип пригляделся ) То ли, реализация на JVM показалась хорошим решением. Почти наверняка, сказалось начало чтения SICP (там используется LISP, но мне хотелось чего-то более современного). Словом, что-то потянуло к Clojure, и я решил начать изучение.

Как и для любого инструмента, в особенности для языка программирования, немалое значение имеет его экосистема. Насколько хорошо описана документация; блоги, сообщества, группы; как организовано использование библиотек (например, в Ruby очень удобно оно организовано с помощью Gem-ов); есть ли какие-то фреймворки, ORM, средства для решения повседневных задач (тот же HTTP-клиент, например) и так далее. Всё это действительно важно, потому что помимо изучения самого языка, на мой взгляд, большой интерес представляет его комьюнити. И если оно не слишком развито, невольно возникает вопрос — почему? К счастью, у Clojure здесь всё в полном порядке. Вменяемая документация, достаточно широкое комьюнити, большое количество всевозможных библиотек и множество информации в блогсфере. Словом, ура!

Познакомившись с Clojure в общих чертах закономерно возник вопрос: как обеспечить наиболее удобный процесс разработки? Сначала для изучения и экспериментов, затем (если повезёт) для написания полезного кода, в любом случае, и то, и другое хочется делать с радостью, не отвлекаясь на рутинные мелочи. В дальнейшем повествовании ждёт ответ на этот вопрос )

UPDATE

Для уменьшения описанных ниже шагов вплоть до одного был создан bash скрипт под Ubuntu.

Прежде всего, давайте разберёмся как написать, ставшую де-факто, программу «Привет, Clojure!» самым простым методом, а затем посмотрим, можно ли это сделать как-то поудобней. Для установки я буду использовать чистую Ubuntu 13.04. Итак, поехали!

Для начала установим боевой комплект выполнения Java приложений, поскольку Clojure реализован именно на Java и для работы требует хотя бы JRE. Впрочем, мы установим весь комплект Java SDK на всякий случай ) Можно воспользоваться Open Source версией Java — Open JDK из репозиториев Ubuntu (sudo apt-get install openjdk-7-jdk), но, на мой взгляд, лучше использовать родную версию Oracle. Для этого добавим репозиторий и установим нужный нам пакет:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

проверяем, что всё в порядке:

java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode)

и двигаемся дальше. Следующий пункт назначения http://clojure.org/downloads. Скачиваем архив с последней стабильной версией (на момент написания статьи была доступна версия 1.5.1), распаковываем и переходим в созданный каталог (clojure-1.5.1/). Мы в одном шаге от написания и запуска нашей волшебной программы. Как и многие динамические языки, Clojure содержит в себе REPL, которым мы и воспользуемся:

java -cp clojure-1.5.1.jar clojure.main
Clojure 1.5.1
user=>

Теперь можем написать первый исходный код:

(println "Hello, Clojure!")
Hello, Clojure!
nil
user=>

Выглядит пристойно, хотя мы замечаем, что readline не работает и конечно же хочется исполнять код из файла. Для этого где-нибудь создадим файл code.clj и наполним его всё тем же содержимым:

(println "Hello, Clojure!")

Чтобы исполнить эту партию (предполагается, что файл code.clj находится на уровень выше относительно каталога clojure-1.5.1/), необходимо выполнить:

java -cp clojure-1.5.1.jar clojure.main ../code.clj
Hello, Clojure!

Здорово, но не слишком удобно. Поисследовав раздел http://clojure.org/getting_started, выяснилось, что существует фантастический проект Leiningen. По своей сути, это нечто напоминающее Rake, Bundler и RubyGems в одном флаконе, и оно нам явно пригодится! Добываем скрипт, помещаем его в какой-нибудь каталог, доступный для переменной окружения $PATH (например, /usr/bin), делаем скрипт исполняемым и запускаем его:

sudo sh -c "curl https://raw.github.com/technomancy/leiningen\
/stable/bin/lein > /usr/bin/lein"
cd /usr/bin
sudo chmod a+x lein
lein

Результат покажет нам множество различных задач, которые можно выполнить с помощью Leiningen от создания нового проекта до запуска REPL. К слову, в этом REPLreadline работает как надо. Однако, не будем отклонятся от курса, ведь наша задача в поиске более удобного способа запуска *.clj файлов. И для этого мы воспользуемся lein-exec — плагином для Leiningen. Следуя по следам установки, откроем (или создадим) файл .lein/profiles.clj в домашнем каталоге и внесём в него информацию о плагине:

{:user {:plugins [[lein-exec "0.3.1"]]}}

Теперь мы сможем исполнить файл code.clj простой командой:

lein exec code.clj

В результате мы получили простой и удобный способ исполнения *.clj файлов, который сделает изучение и разработку на Clojure ещё более радостной и интересной :)

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s