Clojure: попробуйте перехватить макрос, который также закрывает любые файловые потоки (не with-open)

ОБНОВИТЬ:

Спасибо за всю помощь до сих пор. Это мой новый код, который работает. Но не совсем так, как хотелось бы.

Мне нужно, чтобы вернуть исключение Java (нене спрашивай меня почему). Пример:

(safe (/ 1 0))<br><br>#

именно так я и хочу. Но когда я использую другие пункты кода, которые обрабатывают привязки и т. Д., Я получаю исключение 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)

Что я могу сделать, чтобы предотвратить это, и вместо этого показать исключение 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)))))))
ОЛДИ»

я пытаюсь выполнить задание, но этоневозможно без какого-либо обучения. Мои учителя ожидают, что мы научим себя Clojure через 1 неделю и выполним это задание. Все в моем классе застряли, и мы уже ненавидим учителя, Имао.

Итак, предполагается, что макрос сможет пробовать код и возвращать результат или исключение. Это'Предполагается, что он сможет обрабатывать такие выражения, как:

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

Если код открывает какие-либо файловые потоки или еще что-то, он должен закрыть их в предложении finally. Это то, что я получил до сих пор - я понимаю этоне работает.

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

Я получаю ошибку:

Невозможно разрешить символы: s в этом контексте, компилирование: (NO_SOURCE_PATH: 1)

Я впал в отчаяние, поэтому я пробовал много разных вещей, я пытался:

to edit the macro:

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

затем запустите:

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

В результате чего:

Нет такого var: clooj.cemerick.pomegranate / Closable, компилирование: (NO_SOURCE_PATH: 1)

Кто-то упомянул макрос WITH-OPEN, но я думаю, что выигралхорошо работает с моим общим макросом. Макрос неОн предназначен для открытия файлов, но если они есть, он обязательно должен их закрыть.

Так чертовски, выигралты не подал мне руку Stackoverflow-гении? Заранее спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос