<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7772796624518921181</id><updated>2012-02-15T22:43:48.042-08:00</updated><category term='leiningen'/><category term='emacs'/><category term='java'/><category term='clojure'/><category term='fp'/><category term='slime'/><title type='text'>*bullshit-mode-on*</title><subtitle type='html'>Вещи что взбредают мне на ум.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://zahardzhan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7772796624518921181/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://zahardzhan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>zahardzhan</name><uri>http://www.blogger.com/profile/06066181731063417392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_b3dJbmc3zr0/S36ZvHtFfRI/AAAAAAAAAGI/PTmQVz4CM2M/S220/face.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7772796624518921181.post-4706137828713183287</id><published>2010-10-24T18:25:00.001-07:00</published><updated>2010-10-24T18:25:41.966-07:00</updated><title type='text'></title><content type='html'>&lt;span class="Apple-style-span" style="color: #424037; font-family: 'Lucida Grande', Verdana, 'Bitstream Vera Sans', Arial, sans-serif; font-size: 12px; line-height: 19px;"&gt;Этот блог переехал на&amp;nbsp;&lt;a href="http://zahardzhan.github.com/" style="color: #580000; text-decoration: none;"&gt;http://zahardzhan.github.com&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7772796624518921181-4706137828713183287?l=zahardzhan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zahardzhan.blogspot.com/feeds/4706137828713183287/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://zahardzhan.blogspot.com/2010/10/httpzahardzhan.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7772796624518921181/posts/default/4706137828713183287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7772796624518921181/posts/default/4706137828713183287'/><link rel='alternate' type='text/html' href='http://zahardzhan.blogspot.com/2010/10/httpzahardzhan.html' title=''/><author><name>zahardzhan</name><uri>http://www.blogger.com/profile/06066181731063417392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_b3dJbmc3zr0/S36ZvHtFfRI/AAAAAAAAAGI/PTmQVz4CM2M/S220/face.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7772796624518921181.post-7163645717903619024</id><published>2010-02-19T03:16:00.001-08:00</published><updated>2010-02-19T04:44:40.247-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slime'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='fp'/><category scheme='http://www.blogger.com/atom/ns#' term='leiningen'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Настройка Emacs для программирования на Clojure</title><content type='html'>&lt;div&gt;В статье я расскажу как сделать из Emacs'а удобную среду для программирования на языке Clojure. Рассчитываю на то, что вы используете Debian или Ubuntu в качестве своей операционной системы.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Кто не знает, Clojure это современный диалект лиспа. Очень простой и мощный язык программирования общего назначения с упором на функциональный стиль, широкой поддержкой возможностей для многопоточного программирования и, конечно, родным для лиспа представлением кода как данных и наоборот. Clojure работает поверх виртуальной машины Java и виртуальной машины Common Language Runtime — части пакета Microsoft .NET Framework.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Итак, пристуим.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;1. Java.&lt;/h3&gt;&lt;div&gt;В репозитории есть несколько альтернативных джав — OpenJDK и Sun Java — ставим на свой вкус любой JDK, но обязательно самый последний, 6-ой.&lt;/div&gt;&lt;blockquote&gt;# sudo aptitude install sun-java6-jdk&lt;/blockquote&gt;&lt;div&gt;Однако, надо соблюсти осторожность при использовании OpenJDK — в swank-clojure есть пренеприятный баг при подключении к java-машине из Slime. Однажды у меня возникла с ним проблема, и дабы разрешить её я нарыл в сети следующее заклинание:&lt;/div&gt;&lt;blockquote&gt;# sudo sed -i 's/net.ipv6.bindv6only\ =\ 1/net.ipv6.bindv6only\ =\ 0/' &amp;nbsp;/etc/sysctl.d/bindv6only.conf &amp;amp;&amp;amp; sudo invoke-rc.d procps restart&lt;/blockquote&gt;&lt;h3&gt;2. Emacs.&lt;/h3&gt;&lt;div&gt;Emacs устанавливается командой&lt;/div&gt;&lt;blockquote&gt;# sudo aptitude install emacs&lt;/blockquote&gt;&lt;div&gt;В Ubuntu ставится самый последний, 23-ий Emacs, в Debian же, в стабильном репозитории lenny лежит старый, 22-ой, а свежий нужно ставить из тестируемого репозитория squeeze или репозитория со снапшотами &lt;a href="http://emacs.orebokech.com/" id="wk_0" title="http://emacs.orebokech.com/"&gt;http://emacs.orebokech.com/&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;3. ELPA.&lt;/h3&gt;&lt;div&gt;Как говорится, Emacs — не только редактор, но и весьма себе неплохая ОС, и как у всякой хорошей оси у него есть свой собственный пакетный менеджер а'ля apt, только устанавливает он специально заготовленные пакеты-расширения эмакса. На сайте ELPA &lt;a href="http://tromey.com/elpa/install.html" id="fg9l" title="http://tromey.com/elpa/install.html"&gt;http://tromey.com/elpa/install.html&lt;/a&gt; приведена инструкция по установке: копируем этот код&lt;/div&gt;&lt;blockquote&gt;(let ((buffer (url-retrieve-synchronously&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;"&lt;a href="http://tromey.com/elpa/package-install.el" id="g11o" title="http://tromey.com/elpa/package-install.el"&gt;http://tromey.com/elpa/package-install.el&lt;/a&gt;")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(save-excursion&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(set-buffer buffer)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(goto-char (point-min))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(re-search-forward "^$" nil 'move)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(eval-region (point) (point-max))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(kill-buffer (current-buffer))))&lt;/blockquote&gt;&lt;div&gt;в *scratch* буфер эмакса, наводим курсор на последнюю скобку, и жмём C-x C-e, чтобы запустить код — он автоматически скачает файл package.el в ~/.emacs.d/elpa/package.el и отредактирует основной файл с настройками ~/.emacs, чтобы менеджер пакетов и всё, что он понаустанавливал потом запускалось при старте эмакса.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;4. Swank-clojure и clojure-mode.&lt;/h3&gt;&lt;div&gt;Swank-clojure это расширение для Emacs, которое позволяет исользовать в нём Slime на пару с Clojure. А сlojure-mode — это режим эмакса для удобного редактирования исходников на Clojure, он даёт подсветку элементов синтаксиса, ключевых слов и табуляцию лиспокода в лучших традициях. Оба этих пакета ставятся через ELPA и тянут за собой Slime оттуда же как зависимость. Это ничего, но если нужна поддержка других лиспов, будь то Common Lisp или Scheme, надо будет поставить Slime еще и через Git или репозиторий оси.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;В Emacs'е откроте список пакетов ELPA&lt;/div&gt;&lt;blockquote&gt;M-x package-list-packages&lt;/blockquote&gt;&lt;div&gt;и выберите клавишей i пакеты (если выбрали не то — клавиша u отменит выбор)&lt;/div&gt;&lt;ul&gt;&lt;li&gt;clojure-mode&lt;/li&gt;&lt;li&gt;clojure-test-mode&lt;/li&gt;&lt;li&gt;slime&lt;/li&gt;&lt;li&gt;slime-repl&lt;/li&gt;&lt;li&gt;swank-clojure&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Нажмите x чтобы установить то, что выбрали. Как скачается и установится — можно закрыть Emacs и продолжить.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;5. Запуск REPL'а Clojure с целью поиграться.&lt;/h3&gt;&lt;div&gt;Собственно, мы установили всё что нужно для того, чтобы запустить Clojure, кроме самой Clojure. Тут нас поджидает приятный момент — всё остальное будет устанавливаться автоматически, без нашего на то вмешательства. Запустим Emacs и поиграем с Clojure в репле командой&amp;nbsp;&lt;/div&gt;&lt;blockquote&gt;M-x slime&lt;/blockquote&gt;&lt;div&gt;по ходу дела в директорию ~/.swank-clojure скачается 3 jar-пакета — сама clojure, стандартная библиотека clojure-contrib и swank-clojure.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Это была всего лишь базовая установка, однако чтобы извлечь из Clojure больше пользы и создать свой собственный проект, а не просто потыкать REPL, нужно установить еще несколько программ, без которых ну никак не обойтись в разработке.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;6. Git.&lt;/h3&gt;&lt;div&gt;Git — распределённая система управления версиями файлов, созданная Линусом Торвальдсом для управления разработкой ядра Linux. Ко всему она тоже понадобится, ибо большая часть проектов Clojure-коммьюнити, включая саму Clojure, используют эту систему контроля версий, и почти все они хостятся на гитхабе &lt;a href="http://github.com/" id="x532" title="http://github.com/"&gt;http://github.com/&lt;/a&gt;.&lt;/div&gt;&lt;blockquote&gt;# sudo aptitude install git-core&lt;/blockquote&gt;&lt;h3&gt;7. Maven и Аnt.&lt;/h3&gt;&lt;div&gt;Это фреймворки для сборки Java-проектов. Используются как платформа для leiningen.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Установим их&lt;/div&gt;&lt;blockquote&gt;# sudo aptitude install ant maven2&lt;/blockquote&gt;&lt;h3&gt;8. Leiningen.&lt;/h3&gt;&lt;div&gt;Leiningen — это система сборки для проектов на Clojure, созданная, чтобы лисперы не морочили голову с родными для платформы Java системами сборки, которые имеют пристрастие к обильным XML-конфигам, в которых чёрт ногу сломит. В лейнингене Clojure-проект описывается в одном файле на самой же Clojure в виде простой удобочитаемой конструкции. Еще поддерживаются плугины, например, для автодокументации в стиле документации с официального сайта &lt;a href="http://clojure.org/" id="uz8x" title="http://clojure.org"&gt;http://clojure.org&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Скачайте скрипт&amp;nbsp;&lt;/div&gt;&lt;blockquote&gt;# wget &lt;span style="color: black;"&gt;&lt;a href="http://github.com/technomancy/leiningen/blob/master/bin/lein" id="j80k" title="http://github.com/technomancy/leiningen/blob/master/bin/lein"&gt;http://github.com/technomancy/leiningen/blob/master/bin/lein&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;и скопируйте его в какую-нибудь директорию, что прописана в пути PATH, лучше всего в /usr/local/bin/, и дайте право на выполнение +x&lt;/div&gt;&lt;blockquote&gt;# sudo cp lein /usr/local/bin/lein&lt;br /&gt;# sudo chmod +x /usr/local/bin/lein&lt;/blockquote&gt;&lt;div&gt;Лейнинген устанавливает себя сам, наше дело лишь сказать ему, что оно неплохо начать&lt;/div&gt;&lt;blockquote&gt;# lein self-install&lt;/blockquote&gt;&lt;div&gt;И директория ~/.m2 отныне станет кэшем для всех автоматически скачаных jar'ов.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;9. Работа со Slime.&lt;/h3&gt;&lt;div&gt;&lt;div&gt;Практически вся разработка проекта проходит в REPL'е Slime, и есть несколько способов открыть проект в нём.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Способ первый — использовать команду эмакса c указанием пути к проекту&lt;/div&gt;&lt;blockquote&gt;M-x swank-clojure-project&lt;/blockquote&gt;&lt;div&gt;Способ второй — в директории проекта выполнить команду&amp;nbsp;&lt;/div&gt;&lt;blockquote&gt;# lein swank&lt;/blockquote&gt;&lt;div&gt;что запустит REPL на порту 4005, к которому можно будет подключиться из эмакса командой&lt;/div&gt;&lt;blockquote&gt;M-x slime-connect&lt;/blockquote&gt;&lt;div&gt;После подключения получаем REPL Clojure с автоматически установленными Java classpath и да прибудет с нами сила!&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;10. Работа с Clojure и Common Lisp.&lt;/h3&gt;&lt;div&gt;Slime, идущий в поставке ELPA урезан настолько, что годен только для работы с Clojure. Если от эмакса требуется работа с другими лиспами, придется поставить полноценный Slime из git-репозитория&lt;/div&gt;&lt;blockquote&gt;# git clone git://github.com/nablaone/slime.git ~/.emacs.d/slime&lt;/blockquote&gt;&lt;div&gt;и прописать в ~/.emacs следующие строки&lt;/div&gt;&lt;blockquote&gt;(add-to-list 'load-path "~/.emacs.d/slime")&lt;br /&gt;(add-to-list 'load-path "~/.emacs.d/slime/contrib")&lt;br /&gt;&lt;br /&gt;(setq slime-backend "~/.emacs.d/slime/swank-loader.lisp")&lt;br /&gt;&lt;br /&gt;(load "slime-autoloads")&lt;br /&gt;&lt;br /&gt;(require 'slime)&lt;br /&gt;(require 'slime-autoloads)&lt;br /&gt;&lt;br /&gt;(eval-after-load "slime"&lt;br /&gt;&amp;nbsp;&amp;nbsp;`(progn&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; (slime-setup '(slime-repl))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; (custom-set-variables&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'(inhibit-splash-screen t)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'(slime-complete-symbol*-fancy t)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'(slime-complete-symbol-function 'slime-fuzzy-complete-symbol)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'(slime-net-coding-system 'utf-8-unix)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'(slime-startup-animation nil)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'(slime-lisp-implementations '((sbcl ("/usr/bin/sbcl")))))))&lt;/blockquote&gt;&lt;div&gt;что позволит запускать и SBCL и Clojure командами&lt;/div&gt;&lt;blockquote&gt;M-- M-x slime sbcl&lt;br /&gt;M-- M-x slime clojure&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7772796624518921181-7163645717903619024?l=zahardzhan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zahardzhan.blogspot.com/feeds/7163645717903619024/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://zahardzhan.blogspot.com/2010/02/emacs.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7772796624518921181/posts/default/7163645717903619024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7772796624518921181/posts/default/7163645717903619024'/><link rel='alternate' type='text/html' href='http://zahardzhan.blogspot.com/2010/02/emacs.html' title='Настройка Emacs для программирования на Clojure'/><author><name>zahardzhan</name><uri>http://www.blogger.com/profile/06066181731063417392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_b3dJbmc3zr0/S36ZvHtFfRI/AAAAAAAAAGI/PTmQVz4CM2M/S220/face.png'/></author><thr:total>5</thr:total></entry></feed>
