понедельник, 15 апреля 2013 г.

clojure-compile-project.el

При разрастании проекта с использованием clojure надоедает постоянно перекомпилировать весь проект по модулю. Поэтому написал небольшой модуль расширения для emacs, взяв несколько готовых функция с Elisp Cookbook. Работа модуля заключается в следующем: передается отправная точка для рекурсивного обхода директорий и к каждому найденному clojure-файлу применяется функция slime-load-file. До запуска данной функции необходимо выполнить команду clojure-jack-in для запуска repl. Если проект создавался с помощью утилиты lein, то необходимо передавать src директорию.Таким образом, можно без всяких усилий пересобрать проект. Исходный код модуля привожу ниже:

(defun walk-path (dir action)
       "walk DIR executing ACTION with (dir file)"
       (cond ((file-directory-p dir)
              (or (char-equal ?/ (aref dir(1- (length dir))))
                  (setq dir (file-name-as-directory dir)))
              (let ((lst (directory-files dir nil nil t))
                     fullname file)
                (while lst
                  (setq file (car lst))
                  (setq lst (cdr lst))
                  (cond ((member file '("." "..")))
                        (t
                         (and (funcall action dir file)
                              (setq fullname (concat dir file))
                              (file-directory-p fullname)
                              (walk-path fullname action)))))))
             (t
              (funcall action
                       (file-name-directory dir)
                       (file-name-nondirectory dir)))))

(defun walk-path-visitor (dir file)
       "Called by walk-path for each file found"
       (if (string-match "\\.clj\\'" file)
    (slime-load-file (concat  dir file)))
       (concat dir file))


(defvar start-path nil)

(defun compile-project (start-path) 
  (interactive "D" (list (read-from-minibuffer "Start path:"  start-path)))
  (walk-path start-path 'walk-path-visitor))
Конечно, возможно есть более красивое решение, но похоже я слишком плохо искал.

1 комментарий:

  1. Дмитрий, так здорово, что Вы продолжаете публиковать посты на тему Clojure!

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