Cómo volver a cargar un archivo clojure en REPL


Answers

También hay una alternativa como usar tools.namespace , es bastante eficiente:

user=> (use '[clojure.tools.namespace.repl :only (refresh)])

user=> (refresh)

:reloading (namespace.app)

:ok
Question

¿Cuál es la forma preferida de volver a cargar las funciones definidas en un archivo Clojure sin tener que reiniciar el REPL? En este momento, para usar el archivo actualizado, tengo que:

  • editar src/foo/bar.clj
  • cerrar el REPL
  • abre el REPL
  • (load-file "src/foo/bar.clj")
  • (use 'foo.bar)

Además, (use 'foo.bar :reload-all) no da como resultado el efecto requerido, que es evaluar los cuerpos modificados de funciones y devolver nuevos valores, en lugar de comportarse como la fuente no ha cambiado en absoluto.




Tan pronto como (use 'foo.bar) funcione, significa que tiene foo / bar.clj o foo / bar_init.class en su CLASSPATH. Bar_init.class sería una versión compilada de AOT de bar.clj. Si lo haces (use 'foo.bar) , no estoy exactamente seguro si Clojure prefiere la clase sobre clj o al revés. Si preferiría los archivos de clase y usted tiene ambos archivos, entonces está claro que editar el archivo clj y luego volver a cargar el espacio de nombres no tiene ningún efecto.

Por cierto: no necesita load-file antes de use si su CLASSPATH está configurada correctamente.

BTW2: si necesita utilizar load-file por algún motivo, simplemente puede hacerlo nuevamente si editó el archivo.




Intente cargar archivo de nuevo?

Si está utilizando un IDE, generalmente hay un atajo de teclado para enviar un bloque de código al REPL, redefiniendo efectivamente las funciones asociadas.




La mejor respuesta es:

(require 'my.namespace :reload-all)

Esto no solo volverá a cargar el espacio de nombres especificado, sino que también volverá a cargar todos los espacios de nombres de las dependencias.




Related