Я перемещаюсь в Emacs для работы над Clojure/Lisp. Какова вся информация, которую я должен установить на Emacs, чтобы смочь сделать следующее?
Было бы замечательно, если я мог бы также заставить список команд получать эти вещи после установки вещей на Emacs.
Используйте Сервис , если имеется то, что должно выполняться в фоновом режиме в течение длительных периодов времени. Это не связано с какой-либо деятельностью. Канонический пример - музыкальный плеер.
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-Вам нужно будет собрать несколько частей: Emacs, SLIME (который прекрасно работает с Clojure - см. swank-clojure), swank-clojure (реализация Clojure серверного аналога SLIME), clojure-mode, Paredit и, конечно, банка Clojure для начала, то, возможно, некоторые массовки среди которых Leine Как только вы все настроите, вы получите - в Emacs - все функции рабочего процесса/редактирования, которые вы упоминаете в вопросе.
Ниже приведены отличные учебные пособия, в которых описывается, как настроить все это; в Сети есть больше, но некоторые из других довольно устарели, тогда как эти два, кажется, сейчас в порядке:
в которых найдены хитрости торговли относительно клоюре авторства пост в блоге Фила Хагельберга; Фил поддерживает swank-clojure и clojure-режим, а также пакет под названием Emacs Starter Kit, который является чем-то новичок в мире Emacs было бы хорошо посоветовали взглянуть на. Эти инструкции, как представляется, были приведены в соответствие с последними изменениями в инфраструктуре; в случае сомнений, ищите дополнительную информацию о группе Google Клоюре.
Настройка публикации Clojure, Incanter, Emacs, Slime, Swank и Paredit в блоге проекта Incanter. Incanter - это увлекательный пакет, обеспечивающий R-подобную DSL для статистических вычислений, встроенных прямо в Clojure. Это сообщение будет полезно, даже если вы не планируете использовать или даже устанавливать Incanter.
После того, как вы настроите все это, вы можете попробовать и начать использовать его сразу, но я настоятельно советую вам сделать следующее:
Посмотрите на руководство SLIME - оно включено в источники и на самом деле очень читаемо. Кроме того, нет абсолютно никаких причин, почему вы должны читать весь 50-страничный руководство монстра; просто посмотрите вокруг, чтобы увидеть, какие функции доступны.
Примечание: функция autodoc SLIME, обнаруженная в последних восходящих источниках, несовместима с swank-clojure - эта проблема не возникнет, если следовать рекомендации Фила Хагельберга использовать версию ELPA (см. его вышеупомянутую запись в блоге для объяснения) или просто оставить autodoc off (что является состоянием по умолчанию Последний вариант имеет некоторую добавленную привлекательность в том, что вы все еще можете использовать последние SLIME с Common Lisp, в случае, если вы используете это также.
Ознакомьтесь с документами для paredit. Есть два способа: (1) посмотрите на источник - в верхней части файла находится огромное количество комментариев, которые содержат всю необходимую информацию. (2) тип C-h m в Emacs, в то время как paredit-mode является активным - появится буфер с информацией о текущем основном режиме, а затем информацией о всех активных минорных режимах (paredit является одним из них).
Обновление: Я только что нашел этот крутой набор заметок на Паредит Фила Хагельберга... Это ссылка на текстовый файл, я помню, как я видел хороший набор слайдов с этой информацией где-то, но не могу найти его сейчас. В любом случае, это хорошее резюме того, как это работает. Определенно взгляните на это, я не могу жить без Paredit сейчас, и этот файл должен очень легко начать использовать его, я считаю.:-)
На самом деле, комбинация 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))
Комплект 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