好的,所以我有这个宏,它应该接受不同数量的参数,然后用 try 和 catch 执行它们。我假设如果参数列表arg-list
大于 2,那么列表中的第一个元素是绑定,例如这样[a 0]
。所以arg-list
可能看起来像这样:([s (FileReader. (File. "text.txt"))] (. s read))
.
这就是我想出的:
(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 工作了四天,如果我的代码不好,请原谅我。