Friday, February 26, 2010

Настройка clojure-mode. Черновик.

В этом посте я хочу описать, как я настроил у себя среду разработки для Clojure с использованием emacs и Java.
Я использую Ubuntu в качестве ОС, но похожее решение должно работать и для
других ОС. Если вас интересует только clojure, возможно вы захотите пойти по простому пути, но он имеет свои недостатки, которые автор и описал.
1. Установка clojure
Что нам понадобится?
1) Java JDK. Вы можете установить ее средствами системы, например через пакетный менеджер или скачав инсталятор с сайта Оракла. Важно, что бы в результате в PATH были команды java и javac. Текущая версия clojure работает и с .Net/Mono, как ее запускать читайте на сайте clojure. Но этот вариант я не проверял.
2) Git - это система контроля версий, которая понадобится нам для получения нужных частей рещения.
3) Clojure. Лучше брать с сайта . На данный момент в реппозитории Ubuntu версия 1.0, а на сайте 1.1, в которой добавлено много интересных возможностей.
4) clojure-contrib - официальная библиотека для расширения языка.
5) Сложить все *.jar файлы где вы считаете нужным. Лично я создал отдельную директорию /opt/clojure, в которой должно лежать все, связанное с clojure. Теперь можно запускать clojure командой:
java -cp /opt/clojure/clojure.jar clojure.main
Но, нам потребуется сценарий, который я назвал clj-cmd и поместил в PATH:

Пояснение. Вызвав этот скрипт из консоли мы получим clojure, запущенный с поддержкой jline.ConsoleRunner или опций командной строки, а для запуска из emacs используется переменная среды CLJ_CMD, которую мы сгенерируем в emac
Теперь делаем этот скрипт исполняемым:
chmod a+x clj-cmd
Теперь проверяем:
./clj-cmd
Clojure 1.1.0
user=> (+ 1 1)
2
Для желающих собрать из исходников можно сделать это, так как описано ниже:
для сборки нам потребуются системы для сборки java-проектов Ant и Maven. Также не имеет значения, как вы их поставите,
важно, что бы команда ant была в PATH.
Сначала собираем clojure:
cd /opt/experimental/
git clone git://github.com/richhickey/clojure.git
cd clojure
ant
После чего на выходе получим clojure.jar - это и есть реализация языка.
Собираем clojure-contrib - официальная библиотека для расширения языка.
cd ..
git clone git://github.com/richhickey/clojure-contrib.git
cd clojure-contrib
mvn package -Dclojure.jar=/opt/experimental/clojure/clojure.jar
В каталоге target получим clojure-contrib-1.2.0-SNAPSHOT.jar, который и подкинем в каталог с clojure.
cp ./target/clojure-contrib-1.2.0-SNAPSHOT.jar ../clojure/clojure-contrib.jar

2. Теперь у нас есть рабочая clojure и наша задача подружить Clojure и emacs.
Нам потребуются:
1) clojure-mode.el - режим emacs для clojure. Его можно взять тут . Я сложил полученные файлы в ~/elisp/mode/clojure.
далее в конфигурационном файле прописать:

string-join - эта функция объединяет строки, разделяя их разделителем joiner
Эти действия устанавливают переменную окружения CLJ_CMD, которую мы передадим скрипту, запускающему clojure. Она представляет собой строку, типа этой:
java -server -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 -cp /opt/experimental/clojure/clojure.jar:clojure.main:./:~/MY_Projects/java clojure.main
которая запустит сессию clojure.

2) SLIME - это мощная среда разработки Emacs для различных диалектов Lisp. Её можно скачать здесь. После распаковки прописываем в конфигурационном файле:


3) swank-clojure. Это часть, которая позволяет запустить clojure, как SLIME-процесс. Берем его из репозитория
cd /opt/clojure
git clone git://github.com/jochu/swank-clojure.git
Подбрасываем swank-clojure.el в ~/elisp/mode/clojure
cd swank-clojure/
cp swank-clojure.el ~/elisp/mode/clojure/
Далее:
cd ..
mv swank-clojure/src/swank/ ./
rm -r swank-clojure/
и в конфигурационном файле прописываем следующее:

Вот и все. Мы получили работающую среду для clojure. Проверяем:
Создайте где-нибудь файл test.clj и пишем в нем простую функцию:
(defn hello [] "Hello World!")
Emacs подсветит код. Далее
M-x slime
Дождитесь приглашения :
; SLIME 2010-02-20
user>
Возвратитесь к функции hello и нажмите C-c C-c для компиляции. Потом вернитесь в REPL и наберите
(hello)
Вы должны увидеть следующее:
"Hello World!"
Еще примеры:
Наберите :
(System/getProperty "java.class.path")
и нажмите C-c C-e . В результате вы увидите CLASSPATH, который видит clojure
Наберите :
(defn blank? [s] (every? #(Character/isWhitespace %) s))
и скомпилируйте это. Потом наберите (b , нажмите C-c TAB и slime предложит вам выбрать подходящий вариант. Далее введите"
(blank? "some text")
C-c C-e
false
(blank? " ")
C-c C-e
true
(blank? "")
C-c C-e
true.

Ниже я приведу некоторые вещи, которые вы, возможно, найдете удобными для себя.
Настройки slime. Сразу, после (slime-setup) пропишите следующее

Это позволит вам запускать slime по F5 и сделает красивое автодополнение.
Настройки clojure-mode

Покажет детали класса. Наберите (new java.util.Random) и после слова Random M-x slime-java-describe покажет вам методы класса.


Покажет документацию по классу. Например, наберите (new java.util.Random) и после слова Random M-x slime-javadoc.
Некоторые настройки, взятые у Алексея Отта:


После всех манипуляций имеем следующую конфигурацию:

Полезные ссылки:
Блог Телмана Юсупова.
Конфигурация Алексея Отта
Bill Climenson blog.