Clojure: prueba, captura la macro que también cierra los flujos de archivos (no con-abrir)

ACTUALIZAR:

Gracias por toda la ayuda hasta ahora. Este es mi nuevo código, que funciona. Pero no exactamente como me gustaría.
Lo necesito para devolver la excepción de java (no me preguntes por qué). Ejemplo:

(safe (/ 1 0))<br>#<ArithmeticException java.lang.ArithmeticException: Divide by zero>
que es como quiero que sea. Pero cuando hago uso de las otras cláusulas de código que manejan los enlaces, etc., obtengo la excepción Clojure:

(seefe [f(FileReader.(File. "C:/txtf.txt"))](. f read))
FileNotFoundException C:\txtf.txt (The system cannot find the file specified)  java.io.FileInputStream.open (:-2)

¿Qué puedo hacer para evitar esto y mostrar la excepción de Java en su lugar?

(defmacro safe [bindings & code]
  (if (list? bindings)
    `(try 
      (println "line 8: try")
      ~bindings
      (catch Throwable e# e#))

  (if (= (count bindings) 0)
     `(try ~code
           (catch Throwable e# e#))
     `(let ~(subvec bindings 0 2)
                              (try
                                (safe ~(subvec bindings 2) ~@code)
                                (catch Throwable e# e#)
                                (finally
                                 (. ~(bindings 0) close)))))))
ANTIGUO

Estoy tratando de hacer una tarea, pero es imposible sin tutoría. Mis maestros esperan que enseñemos Clojure a nosotros mismos en 1 semana y completemos esta tarea. Todos en mi clase están estancados y ya odiamos al profesor, lmao.

De acuerdo, se supone que la macro debe poder probar el código y devolver un resultado o una excepción. Se supone que es capaz de manejar expresiones como:

(def v (safe [s (FileReader. (File. "file.txt"))] (. s read)))

Si el código abrió cualquier secuencia de archivos o cualquier otra cosa, debería cerrarlos en una cláusula finally. Esto es lo que obtuve hasta ahora, me doy cuenta de que no está funcionando.

(defmacro safe [& body]
`(try ~@body 
 (catch Throwable e# e#)
 (finally 
   (if (. ~@body isInstance Closable) (. ~@body close)))))

El error que recibo es:

No se puede resolver el símbolo: s en este contexto, compilando: (NO_SOURCE_PATH: 1)

Me desesperé, así que probé muchas cosas diferentes, intenté:

to edit the macro:

(defmacro safe [& body]
`(try ~@body 
      (catch Throwable e# e#)
      (finally (if (. ~@body isInstance Closable) (. ~@body close)))))

entonces corre:

(safe (. (java.io.FileReader. (java.io.File. "C:/Users/Dyallo.L/Dropbox/DVK11/PROP/Clojure/txt.txt")) read))

Lo que resultó en:

No existe tal var: clooj.cemerick.pomegranate / Closable, compilando: (NO_SOURCE_PATH: 1)

Alguien mencionó la macro CON ABIERTO pero supongo que no funcionará bien con mi macro genérica. La macro no está destinada a abrir archivos, pero si lo son, definitivamente debería cerrarlos.

Así que, ¿no me das una mano, Stackoverflow-genios? Gracias de antemano.

Respuestas a la pregunta(2)

Su respuesta a la pregunta