gpt4 book ai didi

clojure - Clojure 中的懒惰评估问题

转载 作者:行者123 更新时间:2023-12-02 05:39:28 25 4
gpt4 key购买 nike

它在 REPL 中尝试了以下操作并且没有出现错误(因为惰性求值):

(defn square [n] (* n n))
(if (= 0 0)
(println "hello")
(map square ["a" "b"]))

以下给出错误(因为它被评估):

(defn square [n] (* n n))
(if (= 0 1)
(println "hello")
(map square ["a" "b"]))

我担心的是,如果在一大段代码中,有一些部分是我的测试用例永远无法触及的,那么例如,像上面这样的代码将在生产中崩溃!有没有办法在编译时检查这些东西?

谢谢

最佳答案

这不是惰性评估。这是条件评估。

特殊形式 (if condition expr1 expr2) 仅当条件为假时计算 expr2。

您的担忧与 Clojure 无关,也与懒惰无关。

在 Ruby 中试试这个:

irb(main):003:0> raise "wannabe error" if false
=> nil

[编辑:更准确地回答您的问题]

在动态语言中,您很难在编译时进行此类错误检测。

在运行时,您可以评估具有不同条件值的测试,以达到可能的所有相关代码分支。我猜所有动态语言的情况都是一样的。这就是我们编写测试的原因。

因此,对于您在测试中关注的条件,您希望涵盖真假两种情况。

就我个人而言,我是 QuickCheck 等解决方案的粉丝。出于测试目的,它会生成范围广泛的可能值(如果需要,则由某些条件保护)。在上面的案例中,您只想测试 2 个案例,真和假,但想象一下由各种输入值触发的其他测试。不幸的是,此类生成器的实现并不多。我所知道的动态类型语言的唯一 QuickCheck 克隆是 Erlang(专有且相当昂贵)和 RushCheck对于 ruby 。 Clojure 实现在其 infancy 中.

关于clojure - Clojure 中的懒惰评估问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1895490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com