Actualmente estoy en el proceso de agregar funcionalidad a una aplicación web J2EE existentes, en un contenedor Tomcat, y estoy escribiendo mis adiciones utilizando Clojure. Mi configuración es simple: simplemente agrego llamadas a métodos estáticos generados por clojure, y codigo todo el trabajo duro desde el lado de Clojure. El proceso de compilación consiste en compilar el código de clojure (lein uberjar
) y luego compilar el código java con ese jar en el classpath.¿Cómo conecto un archivo fuente de clojure a un clojure repl en ejecución en Emacs?
En el init webapp, tengo una llamada a una clase generada que dispara un servidor ostentoso con un (swank/start-repl)
. Me gustaría poder conectar el fango de mi Aquamacs a ese servidor, y trabajar de forma interactiva desde allí (hasta cierto punto, no intentaré nada que requiera una recompilación del lado de Java). Pero tengo una situación que no entiendo del todo. Si hago un \M-x slime-connect
, aparece un indicador de REPL (después de haber sido notificado de que no hay ningún proceso de Lisp inferior, que creo que está bien, ya que el proceso Lisp inferior está funcionando fuera de control emacs). Puedo evaluar formularios perfectamente, e incluso puedo inspeccionar cosas como my.own.namespace/my-var
. Sin embargo, si visito un archivo con un código clojure ya compilado, no puedo hacer que limo lo reconozca como su fuente. Considere un simple archivo de clojure:
(ns my.namespace
(:gen-class
:name my.namespace
:methods [#^{:static true} [testFunc [] void]]))
(def *secret* "shhhh")
(defn -testFunc []
(println (str "our secret is: " secret)))
Suponiendo que esto se compila y se incluye en el uberjar cargado por la aplicación de web, puedo eval/inspeccionar my.namespace/*secret*
. Pero si trato de evaluar dentro del búfer de código, Slime piensa que estoy en el espacio de nombres user
(¡que incluso puede tener sentido!). Pero ahora me queda una sola opción de trabajo, tengo que evaluar, ¡uno por uno, todos los formularios en el archivo! \C-c \C-l
(cargar el archivo de origen) no hará nada, aparentemente solo devuelve nada y no genera nada más. Compilar todo parece hacer precisamente eso: compila, muestra errores si los encuentra, pero no cambiará mi espacio de nombres. Y lo más extraño es el \C-~
(paquete y directorio de sincronización), que utilizando Common Lisp hace exactamente lo que yo quiero, pero aquí congela el clojure REPL para siempre.
Siempre existe la opción de cambiar a la REPL, escribiendo (in-ns 'my.namespace)
, y luego todo funciona correctamente. Pero eso simplemente no es lo suficientemente práctico cuando los archivos clojure están creciendo en número (¡ya que el espacio de nombres del buffer del código no cambiará automáticamente!)
Mi pregunta es, entonces, si me falta un comando básico/configuración - o si hay una razón obvia para que este comportamiento ocurra como tal.
Citando la pregunta: "Compilar todo parece hacer exactamente eso", ¿qué quieres decir? Es decir, a qué método de carga del código de Clojure se refiere cuando dice "compilar todo" (el código de Clojure siempre se compila, pero es probable que tenga alguna función SLIME en mente). Además, ¿qué resultado, exactamente, esperas? –
"Compilando todo" - presionando 'Cc Ck' compilará todos los formularios en el búfer del archivo en emacs, presentando errores en esos formularios, y haciendo que los formularios redefinidos (y recientemente definidos) estén disponibles dinámicamente (por ejemplo, una llamada de webapp estará usando este código recién compilado). Perdón por no ser tan claro como pude. – Edgar
Estaba esperando un comportamiento similar al que presento al iniciar SLIME con 'Mx swank-clojure-project': al cambiar al buffer de un archivo, el espacio de nombres cambia automáticamente, por lo que evaluar algo no usará el espacio de nombres' user' . Alternativamente, al compilar/cargar el buffer usando 'C-c C-k' /' C-c C-l' debería evaluar todas las formas, incluyendo el '(ns ...)' inicial, cambiando así a un espacio de nombres específico y haciendo que todas las variables subsecuentes le pertenezcan. ¿No es este el comportamiento esperado en una configuración estándar? (Podría estar mirando de la manera incorrecta ...) – Edgar