它在REPL中尝试了以下内容并且没有错误(因为懒惰的评估):
(defn square [n] (* n n))
(if (= 0 0)
(println "hello")
(map square ["a" "b"]))
Run Code Online (Sandbox Code Playgroud)
以下是错误(因为它被评估):
(defn square [n] (* n n))
(if (= 0 1)
(println "hello")
(map square ["a" "b"]))
Run Code Online (Sandbox Code Playgroud)
我担心的是,如果在一大段代码中,有些部分我的测试用例永远无法触及,那么例如,上面的代码会在生产中崩溃!有没有办法在编译时检查这些东西?
谢谢
Woj*_*rek 10
这不是懒惰的评价.这是有条件的评估.
特殊形式(if condition expr1 expr2)仅在条件为假时才评估expr2.
你的担忧与Clojure和懒惰无关.
在Ruby中尝试这个:
irb(main):003:0> raise "wannabe error" if false
=> nil
Run Code Online (Sandbox Code Playgroud)
[编辑:更准确地回答你的问题]
在编译时,您很难在动态语言中进行此类错误检测.
在运行时,您可以使用不同的条件值来评估测试,以达到可能的所有重要代码分支.我想所有动态语言的情况都是一样的.这就是我们编写测试的原因.
因此,您需要涵盖您在测试中关注的条件,无论是真还是假.
就个人而言,我是QuickCheck等解决方案的粉丝,它可以生成各种可能的值(如果需要,可以通过一些条件保护)以进行测试.在上面的例子中,你只想测试2个案例,无论是真还是假,但想象一下由各种输入值触发的其他测试.不幸的是,这种发电机的实现并不多.我知道的动态类型语言的唯一QuickCheck克隆是针对Erlang(专有且非常昂贵)和RushCheck for Ruby.Clojure的实施还处于起步阶段.