为什么我们在运行时在Clojure中看到与Arity相关的异常?
我想,这是编译器在编译代码本身时应该能够检查的内容。我们只在运行时捕获此类错误的原因是什么。 ?
答案 0 :(得分:6)
Clojure的编译时类型信息非常有限。像map
这样的函数无法指定它只接受单参数函数(当然,即使多集合map
调用也不是这样)。同样,apply
使一切变得非常复杂:考虑(apply f (read-list-from-user))
。那编译成功吗?当然,它必须,即使我们不知道用户是否会为f
输入正确数量的args。因此,该情况必须存在运行时异常;那么你也可以将所有arity异常运行无论如何,因为你不能被编译器保护它们。
答案 1 :(得分:3)
在Clojure中,在编译阶段;先前由阅读器生成的数据结构将转换为Java字节码格式。然后在Clojure运行阶段;字节码被执行。这意味着只在运行时调用函数。
当然,宏扩展发生在编译时阶段。
我认为,这就是在运行阶段捕获与函数arities相关的异常的原因。