在下面的函数中,我在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] ...)))))))
答案 0 :(得分:1)
不幸的是,编译器警告&amp; Clojure中的错误消息通常是简洁的,荒谬的,或者只是简单的遗漏。
我不确定它在这种情况下是否有用,但您可以尝试使用eastwood
Clojure lint工具(请参阅Clojure工具箱中的其他工具)。我还广泛使用了Plumatic Schema,它帮助我避免了许多简单的类型错误。
答案 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;语句和其他语言的编译器所有其他大量的东西。它不知道cond
和case
以及and
和whatever
做了什么 - 它只知道,因为它们是未引用形式的第一个值,它们必须是一种功能;编译器在某种意义上可以&#34;找到&#34;该函数,因此它可以创建调用函数的代码;并且有一堆其他有效的表达式需要传递给函数。 (当然,那些其他表达式可能包含更多的s表达式,代表更多要调用的函数,并且我们继续使用Lisp-hole!)。 KEWL!它是函数,它必须对它传递的参数有某种意义,并做任何函数应该做的事情。编译器并不知道所有这些 - 在非常简单的意义上,它只是读取s表达式并生成调用函数的代码。
如果您坚持将case
- ish参数传递给cond
, 编译器并不关心 。它会愉快地做你所要求的。 cond
将(可能)对这些参数进行barf的事实不是编译器要处理的事情 - 它是程序员的问题。 Lisp / Clojure负责将它正确地放在程序员的肩上,它属于它。