Clojure: try, catch makro, które również zamyka wszystkie strumienie plików (nie z otwartym)

AKTUALIZACJA:

Dziękuję za całą dotychczasową pomoc. To jest mój nowy kod, który działa. Ale nie do końca tak, jak bym tego chciał.
Potrzebuję go, aby zwrócić wyjątek java (nie pytaj mnie dlaczego). Przykład:

(safe (/ 1 0))<br>#<ArithmeticException java.lang.ArithmeticException: Divide by zero>
tak chcę, żeby tak było. Ale kiedy korzystam z innych klauzul kodu obsługujących powiązania itp., Otrzymuję wyjątek 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)

Co mogę zrobić, aby temu zapobiec i zamiast tego pokazać wyjątek Java?

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

Próbuję wykonać zadanie, ale jest to niemożliwe bez żadnego korepetycji. Moi nauczyciele oczekują, że nauczymy się Clojure w ciągu jednego tygodnia i wykonamy to zadanie. Wszyscy w mojej klasie utknęli i już nienawidzimy nauczyciela, Lmao.

Ok, więc makro powinno być w stanie wypróbować kod i zwrócić wynik lub wyjątek. Powinien być w stanie obsługiwać wyrażenia takie jak:

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

Jeśli kod otworzył jakiekolwiek strumienie plików lub cokolwiek, powinien je zamknąć w klauzuli finally. Do tej pory dotarłem - zdaję sobie sprawę, że to nie działa.

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

Błąd, który otrzymuję to:

Nie można rozwiązać symbolu: s w tym kontekście, kompilowanie: (NO_SOURCE_PATH: 1)

Byłem zdesperowany, więc próbowałem wielu różnych rzeczy, próbowałem:

to edit the macro:

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

następnie uruchomić:

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

Co spowodowało:

Nie ma takiego var: clooj.cemerick.pomegranate / Closable, kompilacja: (NO_SOURCE_PATH: 1)

Ktoś wspomniał o makrze WITH-OPEN, ale myślę, że nie zadziała to dobrze z moim ogólnym makrem. Makro nie jest przeznaczone do otwierania plików, ale jeśli tak, powinno je definitywnie zamknąć.

Więc cholernie, nie dasz mi ręki Stackoverflow-geniuses? Z góry dziękuję.

questionAnswers(2)

yourAnswerToTheQuestion