es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilice repl en lugar de println en Clojure.

Digamos que necesitamos evaluar varias cláusulas en un archivo fuente, por ejemplo:

test.clj

@(def x 1)
@(def y 2)
@(def z 3)

Solo se muestra la última evaluación si usamos directamente clj o lein repl,

user => (load-file "test.clj")
3

Podemos rodear cada una de ellas con println para mostrar todas,

test-with-println.clj

(println @(def x 1))
(println @(def y 2))
(println @(def z 3))
user => (load-file "test-with-println.clj")
1
2
3
nil

¿Cuáles son las mejores alternativas para evitar println invasivos en todo el código fuente mientras se pueden imprimir todas las evaluaciones previstas bajo el amparo de REPLs?

@Solución

Gracias a tap> de la respuesta @Sean Corfield, podemos obtener los resultados deseados de la siguiente manera,

  • Pipea todo lo que debería mostrarse a tap>.

test-with-tap.clj

(-> @(def x 1) tap>)
(-> @(def y 2) tap>)
(-> @(def z 3) tap>)
  • Los REPLs no recibirán ninguna salida hasta que tap> sea activado por add-tap.
user=> (load-file "test-with-tap.clj")
nil
user=> (add-tap @(def out (bound-fn* println)))
nil
user=> (load-file "test-with-tap.clj")
1
2
3
user=> (remove-tap out)
nil
user=> (load-file "test-with-tap.clj")
nil
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en Clojure, hay mejores alternativas para evitar invasiones de println por todo el código fuente, pero aún así poder imprimir todas las evaluaciones deseadas bajo el paraguas de REPLs. Una de estas alternativas es utilizar tap>. Podemos dirigir todo aquello que queramos imprimir a tap> como se muestra a continuación:

    (-> @(def x 1) tap>)
    (-> @(def y 2) tap>)
    (-> @(def z 3) tap>)
    

    Las salidas de estas evaluaciones no serán recibidas por los REPLs hasta que tap> sea activado por medio de add-tap. A continuación se muestra un ejemplo de cómo hacer esto:

    (add-tap @(def out (bound-fn* println)))
    

    Después de ejecutar el comando anterior, podemos cargar el archivo nuevamente y ver la salida deseada:

    (load-file "test.clj")
    

    Esto imprimirá todas las evaluaciones deseadas. Luego podemos eliminar el tap como se muestra a continuación:

    (remove-tap out)
    

    De esta manera, podemos evitar utilizar println en todo nuestro código, pero aún así poder imprimir todos los resultados de las evaluaciones deseadas.

Comments are closed.