В одном из своих интервью Алекс Отт рассказывал, чем так удобен slime. Большая часть времени разработки в сложных проектах уходит не на то, чтобы написать исходник, а на то, чтобы понять, как все должно работать. Для этого приходится много экспериментировать, писать дополнительные функции, переписывать по сто раз старые. Если после каждого изменения приходится перезапускать всю инфраструктуру проекта, то на это уходит слишком много времени. Slime позволяет прямо во время работы программы заменять старые функции , добавлять новые и при этом не перезапускать приложение.
Теперь о настройке emacs и clojure. Если не собираетесь использовать swank-clojure, то никаких особенных преимуществ перед прочими средами разработки не получите. Поэтому, устанавливаем swank-clojure, как описано здесь: https://github.com/technomancy/swank-clojure
Далее. В emacs нужно поставить пакеты clojure-mode, slime, slime-repl используя elpa.
Создайте проект leiningen, как описано в руководстве по swank-clojure, подтяните зависимости. В $HOME/.m2/repository/swank-clojure найдете swank-clojure-x.y.z.jar. Я положил ее вместе с clojure.jar, clojure-contrib.jar и jline-0_9_5.jar (http://jline.sourceforge.net/) в /opt/clojure.
Затем – самое интересное. Если вам не нужен leiningen, то внедряем swank в исходник так:
(ns my-app
(:require [swank.swank]))
(swank.swank/start-repl)
Делаем alias для команды clojure в .bashrc:
alias clojure="java -cp /opt/clojure/jline-0_9_5.jar:/opt/clojure/clojure.jar:/opt/clojure/clojure-contrib.jar:/opt/clojure/swank-clojure-1.2.1.jar:./ jline.ConsoleRunner clojure.main"
Запускаем исходник со внедренным swank-ом.
$ clojure code.clj
Запускаем emacs. Выполняем соединение со swank-clojure.
M-x slime-connect
slime-connect
Со всем соглашаемся, появится repl. Однако все эксперименты нужно делать из исходника. Если нужно запустить какую-нибудь функцию, пишем ее прямо в файле, становимся за последней скобочкой функции и нажимаем C-x C-e.
В общем, emacs и swank-clojure очень ускоряют разработку на clojure.
Гораздо проще не запускать clojure вручную, а использовать 'lein swank' - тут есть несколько преимуществ. Во первых можно указать кодировку соединения, а во вторых, может быть выполнен код инициализации - например, подгрузка каких-то пакетов и т.д.
ОтветитьУдалитьP.S. jline кстати криво работает с русскими буквами на ввод
Вообще -- да. Ну тут я имел в виду случай, когда лень создавать проект под коротенький файл на clojure.
ОтветитьУдалитьРасскажите plz как настроить debug в emacs для clojure.
ОтветитьУдалитьНаиболее полное описание из того, что видел -- здесь: http://blog.bensmann.com/setting-up-a-clojure-development-environment
ОтветитьУдалитьВпрочем я ни разу не испытывал потребности в дебагере. Если уж очень нужно -- можно просто выводить значения переменных командой println. Дело в том, что код на Clojure заранее имеет намного меньше ошибок, чем Java. В Java дебагер нужен чтобы посмотреть состояние программы в каждый отдельный момент времени. В Clojure -- это не обязательно, т.к. в нем обычно нет изменяемых данных, и состояние программы, как правило, легко предсказуемо.