вторник, 25 января 2011 г.

Emacs и clojure


В одном из своих интервью Алекс Отт рассказывал, чем так удобен 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.


4 комментария:

  1. Гораздо проще не запускать clojure вручную, а использовать 'lein swank' - тут есть несколько преимуществ. Во первых можно указать кодировку соединения, а во вторых, может быть выполнен код инициализации - например, подгрузка каких-то пакетов и т.д.
    P.S. jline кстати криво работает с русскими буквами на ввод

    ОтветитьУдалить
  2. Вообще -- да. Ну тут я имел в виду случай, когда лень создавать проект под коротенький файл на clojure.

    ОтветитьУдалить
  3. Расскажите plz как настроить debug в emacs для clojure.

    ОтветитьУдалить
  4. Наиболее полное описание из того, что видел -- здесь: http://blog.bensmann.com/setting-up-a-clojure-development-environment
    Впрочем я ни разу не испытывал потребности в дебагере. Если уж очень нужно -- можно просто выводить значения переменных командой println. Дело в том, что код на Clojure заранее имеет намного меньше ошибок, чем Java. В Java дебагер нужен чтобы посмотреть состояние программы в каждый отдельный момент времени. В Clojure -- это не обязательно, т.к. в нем обычно нет изменяемых данных, и состояние программы, как правило, легко предсказуемо.

    ОтветитьУдалить