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

在编译Clojure时获得更多有用的警告,clojure,compilation,compiler-warnings,Clojure,Compilation,Compiler Warnings,在下面的函数中,我使用了cond代替case。我花了很长时间才挑出这个函数。我正在学习clojure,所以这个错误对我来说并不明显。当我试图运行代码到map函数时(使用草书/Intellij调试器),Intellij抱怨:核心没有可执行代码。clj:144。如果clojure编译器知道这一点,是否有在编译器运行时获取警告的选项?编译器(或lint)是否可以在我的代码中执行其他检查 (defn uri-gen [uri fields line] (let [remo "[//\\:*?()&l

在下面的函数中,我使用了
cond
代替
case
。我花了很长时间才挑出这个函数。我正在学习clojure,所以这个错误对我来说并不明显。当我试图运行代码到
map
函数时(使用草书/Intellij调试器),Intellij抱怨:
核心没有可执行代码。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] ...)))))))
(定义uri根[uri字段行]
(让[remo”[/\\:*?()|.%'\\“&]“)
(条件(计数字段)
0(正确的uri…)
1(让…)
(正确答案为空
uri
(应用str)
(地图(fn[信息技术]……)))(信息技术)

不幸的是,Clojure中的编译器警告和错误消息通常简洁、无意义,或者只是简单地丢失了

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


    • 这其实不是编译器的问题

      从编译器的角度来看,您编写的内容非常有意义。Lisp(如Clojure)为编译器“了解”了一些“语法”。例如,它不必担心运算符优先级和“if”和“while”以及“until”等愚蠢的事情“语句和其他语言的编译器都在犹豫。它不知道
      cond
      case
      以及
      做什么-它只知道,因为它们是无引号形式的第一个值,所以它们必须是一个函数;编译器可以在某种意义上“找到”该函数,因此它可以创建调用该函数的代码;之后还有一堆其他的有效表达式需要传递给函数。(当然,这些其他表达式可能由更多的s表达式组成,代表更多要调用的函数,在Lisp中我们就可以了!)。凯尔!这是一个函数,它必须对它传递的参数有某种意义,并且做函数应该做的任何事情。编译器对此一无所知——从非常非常简单的意义上讲,它只是读取s表达式并生成调用函数的代码

      如果您坚持将
      case
      -ish参数传递给
      cond
      编译器不会在意。它会愉快地按照你的要求去做。事实上,
      cond
      将(很可能)吐出所有这些参数,这不是编译器要处理的事情-这是程序员的问题。Lisp/Clojure将正确使用它的责任完全放在程序员的肩上,这是它的职责所在


      Lisp是程序员的一种超级能力。在正确的人手中,它是为人类服务的宝贵工具。在坏人手中,这是一个灾难的配方明智地使用你的力量。:-)

      我的问题是,在本例中,编译器确实知道出了问题。Intellij确实告知某些行没有可执行代码。编译器决定不为这些源代码行生成代码。在我看来,这样的事情应该有可能得到警告,这是合乎逻辑的。