在 Clojure 1.10 的新错误报告阶段中,我们识别出两个单独的阶段 - :compile-syntax-check(由编译器发现的语法错误)和 :compilation(编译期间发生的错误,但不是语法错误)。
后者的示例
user=> a/b
语法错误在 (REPL:0:0) 编译时。
没有名为 a 的命名空间。
user=> (ex-data *e)
#:clojure.error{:phase :compile-syntax-check, :line 0, :column 0, :source "NO_SOURCE_PATH"}
这里的语法是正确的,只是 a 不是一个已知的命名空间。
编译器在区分这两个方面时没有遵循任何模式。我们应该通过异常类型或显式地在 CompilerException 中指定阶段来确保这种一致性。