Да, и если я цитирую "~ x", это исключение выдается
<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: close for class clojure.lang.PersistentVector>
Это потому, что '~x"
теперь относится к [stream (FileReader. (File. "somefile.txt"))]
. Ошибка, которую вы получаете, имеет смысл. Макрос выплевывает код, который пытается вызвать close()
в указанном выше векторе. Вы можете поэкспериментировать с использованием (first ~x)
.
Обратите внимание, что этот макрос является чрезвычайно общим и существенно не уменьшает объем кода, который должен писать пользователь.
Вы можете попробовать что-то в этом направлении (это, вероятно, не работает)
(import '(java.io FileReader File))
(defmacro read([fname]
`(try
(let [stream# (FileReader. (File. ~fname))
rtnval (. stream# read)]
(do
(. stream# close)
rtnval))
(catch Exception e# e#)))
Но я только на 50% уверен, что мой ответ имеет какой-либо смысл.