编译Clojure时获得更多有用的警告

时间:2018-05-05 16:12:27

标签: clojure compilation compiler-warnings

在下面的函数中,我在cond的位置使用了case。我花了很长时间来完成这个功能。我正在学习clojure,所以错误对我来说并不明显。当我尝试将代码运行到map函数(使用cursive / Intellij调试器)时,Intellij抱怨:There is no executable code at core.clj:144。如果clojure编译器知道,是否有在编译器时间获得警告的选项?编译器(或lint)可以在我的代码中进行其他检查吗?

(defn uri-gen [uri fields line]
  (let [remo "[//\\:*?()<>|.%'\"&]"]
    (cond (count fields)
      0 (correct-uri ...)
      1 (let ...)
      (correct-empty
        uri
        (apply str
          (map (fn [it] ...)))))))

2 个答案:

答案 0 :(得分:1)

不幸的是,编译器警告&amp; Clojure中的错误消息通常是简洁的,荒谬的,或者只是简单的遗漏。

我不确定它在这种情况下是否有用,但您可以尝试使用eastwood Clojure lint工具(请参阅Clojure工具箱中的其他工具)。我还广泛使用了Plumatic Sc​​hema,它帮助我避免了许多简单的类型错误。

答案 1 :(得分:0)

这不是编译器的问题。

编译器的角度来看,你所写的内容非常有意义。 You've got an s-expression composed of an s-expression followed by more s-expressions - what's the problem?一个Lisp,比如Clojure,很少有语法和#34;为编译器&#34;知道&#34;关于。例如,它不必担心操作符优先级等愚蠢的事情,如果&#34; &#34;而&#34;而&#34; &#34;直到&#34;语句和其他语言的编译器所有其他大量的东西。它不知道condcase以及andwhatever做了什么 - 它只知道,因为它们是未引用形式的第一个值,它们必须是一种功能;编译器在某种意义上可以&#34;找到&#34;该函数,因此它可以创建调用函数的代码;并且有一堆其他有效的表达式需要传递给函数。 (当然,那些其他表达式可能包含更多的s表达式,代表更多要调用的函数,并且我们继续使用Lisp-hole!)。 KEWL!它是函数,它必须对它传递的参数有某种意义,并做任何函数应该做的事情。编译器并不知道所有这些 - 在非常简单的意义上,它只是读取s表达式并生成调用函数的代码。

如果您坚持将case - ish参数传递给cond 编译器并不关心 。它会愉快地做你所要求的cond将(可能)对这些参数进行barf的事实不是编译器要处理的事情 - 它是程序员的问题。 Lisp / Clojure负责将它正确地放在程序员的肩上,它属于它。

对于程序员来说,Lisp是一种超级大国。在合适的人手中,它是为人类服务的宝贵工具。在错误的手中,它是灾难的秘诀。 Try not to be Tighten - 明智地使用你的权力。 : - )