2011-07-13 27 views
5

Lectura de la API de clojure para la importación Veo que: importar en la macro ns es preferible a la importación, sin embargo, cuando estoy usando swank/limo/emacs, no puedo enviar la (ns ..) s-expression para obtener los deps en el repl, pero usando (import ...) puedo.Clojure import versus import

¿Cuál es la razón por la cual: se prefiere la importación a la importación, y existe una forma rápida de importar los deps de un archivo .clj de s (ns ...) a la copia de seguridad? (La misma pregunta se puede generalizar a: use y: consulte ... gracias)

Respuesta

5

Aquí es mi flujo de trabajo preferido:

  • inicio Swank/limo
  • Abra el archivo que desea trabajar en Emacs
  • No Cc Ck para compilar y cargar el archivo en cuestión
  • Do , seguido de i, escriba el nombre del espacio de nombre en el que está trabajando y presione Introduzca

Ahora su limo REPL debe estar en el espacio de nombres que está trabajando, y se puede añadir a la declaración ns en la parte superior y justo Cc Ck a medida que cambia las cosas (incluyendo sus importaciones ns)

+0

Su último punto no está nada claro para mí. ¿Estás golpeando ',' dentro del archivo en el que estás trabajando? ¿No sería simplemente insertar una coma y una 'i'? – ftravers

+0

Cuando el cursor está en el búfer Slime REPL, antes de escribir algo más en el indicador, escriba un ','. Esto hará que el texto 'Command:' aparezca en el mini-buffer. Ahora inmediatamente escriba 'i', y verá que el texto' Package: 'aparece en el mini-buffer. Ahora comience a escribir el nombre de su paquete, usando el tab-completion como desee, hasta que el nombre completo de su espacio de nombres esté en el mini-buffer. Presione 'ENTER' y su Slime REPL ahora estará en su espacio de nombres de destino. – semperos

2

No estoy seguro de por qué cx ce no funcionaría, pero Cc Cc en la expresión ns funciona correctamente siempre y cuando el espacio de nombres ya exista .

1

: se prefiere importar en la declaración ns porque mantiene todo lo que tiene que ver con el espacio de nombres en un lugar, generalmente en la parte superior del archivo. Esta es una buena práctica de codificación.

Creo que el motivo por el que se evalúa la declaración ns C-x C-e no funciona es parte de la forma en que funciona SLIME. Cuando evalúa un sexp, SLIME lo hace en el espacio de nombre actual. Por lo tanto, la evaluación de (import 'java.io.File) importará el archivo en cualquier espacio de nombre en ns en este momento.

evaluando una declaración (ns my.namespace (: import java.io.File) modifica el espacio de nombre indicado en la declaración, pero no cambia el valor de ns. A menos que cambie a ese espacio de nombre con (en ns 'my.namespace), no verá la importación

2

Se prefiere el formulario (ns ...) ya que su código se leerá más fácilmente. Todas las declaraciones del espacio de nombres se recogerán en la parte superior del archivo. vea esto impuesto por el compilador en idiomas como Java. Además, el macro ns que contiene elimina la necesidad de que usted cite símbolos. Lo mismo puede decirse del uso, importación, referencia, etc.

Creo que elEl acceso directo de babaenviará el fragmento de código al servidor swank conectado y lo evaluará. Por ejemplo la forma:

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

va a crear un nuevo espacio de nombres llamado My.Test que incluye la tala contrib y java.io Archivo. No cambiará el espacio de nombre de la réplica. Para hacerlo, presione C-c M-p desde el archivo que está editando, y se le preguntará con el nombre del espacio de nombres de ese archivo para cambiar (a menos que ya se encuentre en ese espacio de nombres). Presione enter para seleccionar.C-c C-z debe cambiar a la respuesta. Ahora, en lugar de la solicitud user=>, debería ver my.test=>, lo que indica que se encuentra en ese espacio de nombres.

El flujo de trabajo he puesto en marcha es compilar todo el archivo al guardarlo, usando:

(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) 

De esa manera, cuando cada vez que guarda el archivo, que se compila y se carga por el servidor ostentoso, y Utilizo el repl para experimentos en el espacio de nombres en el que estoy trabajando.