Нежное учебное руководство к Emacs/Swank/Paredit для Clojure

Я перемещаюсь в Emacs для работы над Clojure/Lisp. Какова вся информация, которую я должен установить на Emacs, чтобы смочь сделать следующее?

  1. автоматическое соответствие/поколение соответствующих закрывающих скобок
  2. автоматически сместите стиль Lisp/Clojure, не C++ / стиль Java
  3. Подсветка синтаксиса
  4. Вызов REPL
  5. Смочь загрузить часть кода из файла в REPL и оценить его.

Было бы замечательно, если я мог бы также заставить список команд получать эти вещи после установки вещей на Emacs.

87
задан Múna 24 February 2014 в 23:08
поделиться

2 ответа

Используйте Сервис , если имеется то, что должно выполняться в фоновом режиме в течение длительных периодов времени. Это не связано с какой-либо деятельностью. Канонический пример - музыкальный плеер.
AsyncTask имеет большое значение, если некоторые действия должны выполняться в фоновом режиме в текущей операции. Например, загрузка, поиск текста в файле и т.д.
Лично я использую Обработчики только для проводки изменений в поток пользовательского интерфейса. Например, вы делаете некоторые вычисления в фоновом потоке и проводите результат через обработчик.

Суть: в большинстве случаев AsyncTask - это то, что вам нужно.

-121--2087855-

Дебаты по поводу веб-сервисов отнюдь не завершены, но есть некоторые элементы, которые выделяются.

Веб-службы RESTful являются «семьей» веб-служб. Некоторые называют это архитектурой.

Веб-службы RESTful используют протокол HTTP для выполнения запросов от веб-службы. Они используют HTTP-глаголы: GET, POST, PUT и DELETE (и другие, иногда). Сами запросы относятся к URL, которые представляют ресурсы... иногда запросы будут содержать данные в теле, которые могут быть получены с помощью HTML, JSON, двоичных данных или других.

Чисто веб-служба RESTful требует только URL и команду HTTP для описания запрошенного действия... данные тела обычно являются полезной нагрузкой для участия в запрошенном действии... он не должен диктовать запрошенное действие

SOAP, с другой стороны, фактически является протоколом. Обычно он передается по HTTP, но HTTP-запрос является всего лишь методом для получения пакета SOAP к необходимому обработчику. Содержимое запроса SOAP описывает, что клиент хочет выполнить. Он содержит всю необходимую информацию.

Они представляют собой два очень разных способа реализации веб-сервисов. Если вы зададите вопрос «Что лучше», вы наверняка получите сильное мнение с обеих сторон. Я предлагаю вам продолжить расследование и принять решение.

-121--2299975-

[Редактировать из неавторского: это с 2010 года, и процесс значительно упрощен с мая 2011 года. Я добавлю пост к этому ответу с моими заметками о настройке на февраль 2012 года.]

Вам нужно будет собрать несколько частей: Emacs, SLIME (который прекрасно работает с Clojure - см. swank-clojure), swank-clojure (реализация Clojure серверного аналога SLIME), clojure-mode, Paredit и, конечно, банка Clojure для начала, то, возможно, некоторые массовки среди которых Leine Как только вы все настроите, вы получите - в Emacs - все функции рабочего процесса/редактирования, которые вы упоминаете в вопросе.

Основные настройки:

Ниже приведены отличные учебные пособия, в которых описывается, как настроить все это; в Сети есть больше, но некоторые из других довольно устарели, тогда как эти два, кажется, сейчас в порядке:

  1. в которых найдены хитрости торговли относительно клоюре авторства пост в блоге Фила Хагельберга; Фил поддерживает swank-clojure и clojure-режим, а также пакет под названием Emacs Starter Kit, который является чем-то новичок в мире Emacs было бы хорошо посоветовали взглянуть на. Эти инструкции, как представляется, были приведены в соответствие с последними изменениями в инфраструктуре; в случае сомнений, ищите дополнительную информацию о группе Google Клоюре.

  2. Настройка публикации Clojure, Incanter, Emacs, Slime, Swank и Paredit в блоге проекта Incanter. Incanter - это увлекательный пакет, обеспечивающий R-подобную DSL для статистических вычислений, встроенных прямо в Clojure. Это сообщение будет полезно, даже если вы не планируете использовать или даже устанавливать Incanter.

Положив все на работу:

После того, как вы настроите все это, вы можете попробовать и начать использовать его сразу, но я настоятельно советую вам сделать следующее:

  1. Посмотрите на руководство SLIME - оно включено в источники и на самом деле очень читаемо. Кроме того, нет абсолютно никаких причин, почему вы должны читать весь 50-страничный руководство монстра; просто посмотрите вокруг, чтобы увидеть, какие функции доступны.

    Примечание: функция autodoc SLIME, обнаруженная в последних восходящих источниках, несовместима с swank-clojure - эта проблема не возникнет, если следовать рекомендации Фила Хагельберга использовать версию ELPA (см. его вышеупомянутую запись в блоге для объяснения) или просто оставить autodoc off (что является состоянием по умолчанию Последний вариант имеет некоторую добавленную привлекательность в том, что вы все еще можете использовать последние SLIME с Common Lisp, в случае, если вы используете это также.

  2. Ознакомьтесь с документами для paredit. Есть два способа: (1) посмотрите на источник - в верхней части файла находится огромное количество комментариев, которые содержат всю необходимую информацию. (2) тип C-h m в Emacs, в то время как paredit-mode является активным - появится буфер с информацией о текущем основном режиме, а затем информацией о всех активных минорных режимах (paredit является одним из них).

    Обновление: Я только что нашел этот крутой набор заметок на Паредит Фила Хагельберга... Это ссылка на текстовый файл, я помню, как я видел хороший набор слайдов с этой информацией где-то, но не могу найти его сейчас. В любом случае, это хорошее резюме того, как это работает. Определенно взгляните на это, я не могу жить без Paredit сейчас, и этот файл должен очень легко начать использовать его, я считаю.:-)

  3. На самом деле, комбинация C-h m расскажет вам обо всех клавишах, активных в SLIME REPL, в clojure-режиме (вы захотите запомнить C-C-k для отправки текущего буфера для компиляции) и даже в любой эме

Что касается загрузки кода из файла и последующего экспериментирования с ним в REPL: используйте вышеупомянутую комбинацию C-c C-k для компиляции текущего буфера, затем используйте или требуйте его пространства имен в REPL. Затем проведите эксперимент.

Заключительные примечания:

Будьте готовы к тому, что придется подправить вещи на некоторое время, прежде чем все щелкают. Там много инструментов, и их взаимодействия в основном довольно гладкие, но не до точка, когда можно было бы с уверенностью предположить, что вам не придется делать некоторые корректировки изначально.

Наконец, вот немного кода, который я храню в .emacs , который вы не найдете в другом месте (хотя он основан на крутой функции Фила Хагельберга). Я чередуюсь между запуском своих сванков с помощью lein swank (одной из более крутых особенностей Лейнингена) и использованием функции clojure-project , как показано ниже, чтобы запустить всю вещь из Emacs. Я сделал все возможное, чтобы последние создали среду, близкую к той, которую предоставляет lein swank . О, и если вы просто хотите REPL в Emacs для быстрого и грязного эксперимента, то при правильной настройке вы должны иметь возможность использовать M-x slime непосредственно.

(setq clojure-project-extra-classpaths
      '(
        ; "deps/"
        "src/"
        "classes/"
        "test/"
        ))

(setq clojure-project-jar-classpaths
      '(
        ; "deps/"
        "lib/"
        ))

(defun find-clojure-project-jars (path)
  (apply #'append
         (mapcar (lambda (d)
                   (loop for jar in (remove-if (lambda (f) (member f '("." "..")))
                                               (directory-files d t))
                         collect jar into jars
                         finally return jars))
                 (remove-if-not #'file-exists-p
                                clojure-project-jar-classpaths))))

(defun find-clojure-jar (jars)
  (let ((candidates
         (remove-if-not
          (lambda (jar)
            (string-match-p "clojure\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
          jars)))
    (if candidates
        (car candidates)
      (expand-file-name "~/.clojure/clojure.jar"))))

(defun find-clojure-contrib-jar (jars)
  (let ((candidates
         (remove-if-not
          (lambda (jar)
            (string-match-p "clojure-contrib\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
          jars)))
    (if candidates
        (car candidates)
      (expand-file-name "~/.clojure/clojure-contrib.jar"))))

;;; original due to Phil Hagelberg
;;; (see `Best practices for Slime with Clojure' thread on Clojure Google Group)
(defun clojure-project (path)
  "Sets up classpaths for a clojure project and starts a new SLIME session.

   Kills existing SLIME session, if any."
  (interactive (list (ido-read-directory-name
                      "Project root:"
                      (locate-dominating-file default-directory "pom.xml"))))
  (when (get-buffer "*inferior-lisp*")
    (kill-buffer "*inferior-lisp*"))
  (cd path)
  ;; I'm not sure if I want to mkdir; doing that would be a problem
  ;; if I wanted to open e.g. clojure or clojure-contrib as a project
  ;; (both lack "deps/")
                                        ; (mapcar (lambda (d) (mkdir d t)) '("deps" "src" "classes" "test"))
  (let* ((jars (find-clojure-project-jars path))
         (clojure-jar (find-clojure-jar jars))
         (clojure-contrib-jar (find-clojure-contrib-jar jars)))
    (setq swank-clojure-binary nil
          ;; swank-clojure-jar-path (expand-file-name "~/.clojure/clojure.jar")
          swank-clojure-jar-path clojure-jar
          swank-clojure-extra-classpaths
          (cons clojure-contrib-jar
                (append (mapcar (lambda (d) (expand-file-name d path))
                                clojure-project-extra-classpaths)
                        (find-clojure-project-jars path)))
          swank-clojure-extra-vm-args
          (list (format "-Dclojure.compile.path=%s"
                        (expand-file-name "classes/" path)))
          slime-lisp-implementations
          (cons `(clojure ,(swank-clojure-cmd) :init swank-clojure-init)
                (remove-if #'(lambda (x) (eq (car x) 'clojure))
                           slime-lisp-implementations))))
  (slime))
89
ответ дан 24 November 2019 в 07:51
поделиться

Комплект Emacs Starter получил отличные отзывы для начала работы с Clojure:

Чтобы ответить только на шикарную часть вашего вопроса:

Leiningen - это действительно простой способ настроить swank с правильным classpath и подключить его к Emacs.

Отличное видео здесь: http://vimeo.com/channels/fulldisclojure#8934942 Вот пример файла project.clj, который

(defproject project "0.1"
    :dependencies [[org.clojure/clojure
                      "1.1.0-master-SNAPSHOT"]
                   [org.clojure/clojure-contrib
                      "1.0-SNAPSHOT"]]
    :dev-dependencies [[leiningen/lein-swank "1.1.0"]]
    :main my.project.main)

затем запускается:

lein swank

и из Emacs:

 alt-x slime-connect
8
ответ дан 24 November 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: