gpt4 book ai didi

clojure - 在 Clojure 中是否有一个惯用的替代品来代替零双关语?

转载 作者:行者123 更新时间:2023-12-03 17:07:38 24 4
gpt4 key购买 nike

我正在阅读一些 Clojure 代码,其中有一堆未初始化的值,如 nil用于记录中传递的数值。

现在有很多 Clo​​jure 库 treat this as idiomatic .这意味着它是一个公认的约定。

但它也导致NullPointerException ,因为并非所有的 Clojure 核心函数都可以处理 nil作为输入。 (他们也不应该)。

其他语言有 Maybe 的概念或 Option在它为空的情况下代理该值,作为缓解 NullPointerException 的一种方式风险。这在 Clojure 中是可能的 - but not very common .

你可以用 fnil 做一些小把戏但它并不能解决所有问题。

另一种选择是简单地将未初始化的值设置为类似 :empty-value 的符号。强制用户在所有处理代码中明确处理这种情况。但这与 nil 相比并不是真正的大进步。 - 因为直到运行时您才真正发现所有场景(在其他人的代码中)。

我的问题是:在 Clojure 中是否有一个惯用的替代品来代替零双关语?

最佳答案

不确定你是否读过这个 lispcast postnil-punning ,但我确实认为它很好地说明了为什么它是惯用的,并涵盖了我在其他 SO 问题中没有看到的各种重要考虑因素。

基本上,nil在clojure中是一流的东西。尽管它具有固有的常规含义,但它是一个适当的值,并且可以在许多上下文中以依赖于上下文的方式进行处理。这使它比 null 更加灵活和强大。在宿主语言中。

例如,这样的事情甚至不会在 Java 中编译:

if(null) {
....
}

在 clojure 中, (if nil ...)会工作得很好。所以很多情况下都可以用nil 安全 .我还没有看到一个 Java 代码库中没有像 if(foo != null) { ... 这样的代码。到处。也许 java 8 的 Optional将改变这一点。

我认为在处理实际 null 的 Java 互操作场景中,您很容易遇到问题。 s。在许多情况下,一个好的 clojure 包装器库也可以帮助您避免这种情况,这也是在可能的情况下更喜欢直接 Java 互操作的一个很好的理由。

有鉴于此,您可能需要重新考虑与此电流作斗争。但既然你问的是替代方案,我认为这是一个很好的选择: prismatic's schema .架构有一个 Maybe模式(以及许多其他有用的模式),并且它在许多情况下都可以很好地工作。该库非常受欢迎,我成功地使用了它。 FWIW,推荐在最近 clojure applied书。

关于clojure - 在 Clojure 中是否有一个惯用的替代品来代替零双关语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34609428/

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