Clojure импорт против импорта - PullRequest
5 голосов
/ 13 июля 2011

Чтение clojure API для импорта. Я вижу, что: импорт в макросе ns предпочтительнее импорта, однако, когда я пишу код с использованием swank / slime / emacs, я не могу cx ce (ns ..) s-Выражение, чтобы получить deps в repl, но с помощью (импорт ...) я могу.

В чем причина: импорт предпочтительнее импорта, и есть ли быстрый способ импортировать deps из (ns ...) s-expr из моего .clj-файла в repl?(Тот же вопрос можно обобщить на: использовать и: см. Спасибо.)

Ответы [ 4 ]

5 голосов
/ 18 июля 2011

Вот мой предпочтительный рабочий процесс:

  • Старт Суонк / Слизь
  • Откройте файл, над которым я хочу работать в Emacs
  • Do C-c C-k для компиляции и загрузки рассматриваемого файла
  • Do , , затем i , затем введите имя пространства имен, над которым вы работаете, и нажмите Enter

Теперь ваш Replay Slime должен находиться в пространстве имен, над которым вы работаете, и вы можете добавить к объявлению ns вверху и просто Cc Ck , когда вы меняете вещи (включая ваш * 1024). * импорт).

2 голосов
/ 20 июля 2011

Форма (ns ...) предпочтительна, так как ваш код будет читаться легче. Все объявления пространства имен будут собраны в верхней части файла. Вы видите, как это обеспечивается компилятором в языках, подобных Java. Также содержащий макрос ns избавляет вас от необходимости заключать символы в кавычки. То же самое можно сказать об использовании, импорте, ссылке и т. Д.

Я думаю, что ярлык C-x C-e slime отправит кусок кода на подключенный сервер-swank и оценит его. Например, форма:

(ns my.test
   (:require [clojure.contrib.logging :as log])
   (:import [java.io File]))

создаст новое пространство имен my.test, которое включает в себя журналирование contrib и файл java.io. Это не изменит пространство имен repl. Для этого нажмите C-c M-p из файла, который вы редактируете, и вам будет предложено указать имя пространства имен этого файла для переключения (если вы еще не находитесь в этом пространстве имен). Нажмите ввод, чтобы выбрать. C-c C-z должен переключиться на реплику. Теперь вместо приглашения user=> вы должны увидеть my.test=>, указывая, что вы находитесь в этом пространстве имен.

Рабочий процесс, который я настроил, состоит в том, чтобы скомпилировать весь файл при сохранении, используя:

(defun ed/clojure-compile-on-save (&optional args)
  "Compile with slime on save"
  (interactive)
  (if (and (eq major-mode 'clojure-mode)
      (slime-connected-p))
      (slime-compile-and-load-file)))
(add-hook 'after-save-hook 'ed/clojure-compile-on-save)

Таким образом, когда я сохраняю файл, он компилируется и загружается swank-сервером, и я использую repl для экспериментов в пространстве имен, над которым я работаю.

2 голосов
/ 13 июля 2011

Я не уверен, почему c-x c-e не будет работать, но C-c C-c в выражении ns работает правильно, пока пространство имен уже существует.

1 голос
/ 19 июля 2011

: импорт в объявлении ns предпочтителен, потому что он хранит все, что связано с пространством имен, в одном месте, обычно в верхней части файла. Это хорошая практика кодирования.

Я полагаю, что причина, по которой провозглашается декларация ns C-x C-e не работает, является частью работы SLIME. Когда вы оцениваете sexp, SLIME делает это в текущем пространстве имен. Таким образом, evaling (import 'java.io.File) импортирует File в любое пространство имен в <em>ns</em> на данный момент.

Проверка объявления (ns my.namespace (: import java.io.File) изменяет пространство имен, указанное в объявлении, но не меняет значение <em>ns</em>. Если вы не измените это пространство имен с помощью (в -ns 'my.namespace), вы не увидите импорт

...