为什么我们在运行时在Clojure中看到与Arity相关的异常?

时间:2014-03-22 18:48:39

标签: clojure

为什么我们在运行时在Clojure中看到与Arity相关的异常?

我想,这是编译器在编译代码本身时应该能够检查的内容。我们只在运行时捕获此类错误的原因是什么。 ?

2 个答案:

答案 0 :(得分:6)

Clojure的编译时类型信息非常有限。像map这样的函数无法指定它只接受单参数函数(当然,即使多集合map调用也不是这样)。同样,apply使一切变得非常复杂:考虑(apply f (read-list-from-user))。那编译成功吗?当然,它必须,即使我们不知道用户是否会为f输入正确数量的args。因此,该情况必须存在运行时异常;那么你也可以将所有arity异常运行无论如何,因为你不能被编译器保护它们。

答案 1 :(得分:3)

在Clojure中,在编译阶段;先前由阅读器生成的数据结构将转换为Java字节码格式。然后在Clojure运行阶段;字节码被执行。这意味着只在运行时调用函数。

当然,宏扩展发生在编译时阶段。

我认为,这就是在运行阶段捕获与函数arities相关的异常的原因。