好吧,所以我有这个宏应该采取不同数量的参数,然后用try和catch执行它们。我假设如果参数列表arg-list
大于2,那么列表中的第一个元素是一个绑定,例如[a 0]
。所以arg-list
可能看起来像这样:([s (FileReader. (File. "text.txt"))] (. s read))
。Clojure,宏扩展到执行代码列表
这是我想出来的:
(defmacro safe [& arg-list] (list 'if (list '< (list 'count arg-list) '2)
(list 'try (list 'eval arg-list) (list 'catch 'Exception 'e 'e))
(list 'do (list 'eval arg-list) (list 'try (list 'eval (list 'rest arg-list)) (list 'catch 'Exception 'e 'e)))))
我一直在努力得到这个现在像两连胜天工作,但它永远不会奏效。当我尝试这个宏与这个例子:
(safe (+ 2 3))
我得到这个错误:
ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn user/eval91 (NO_SOURCE_FILE:100)
我只一直在使用Clojure四天所以原谅我,如果我的代码是坏的。
谢谢,非常详尽的答案!我会将它标记为解决方案,因为它是有效的,但是我将不得不再次研究这个答案,直到我理解了这一切。 – Topsic