在Clojure中,有没有一种惯用的方法可以替代无双关语?
我现在正在读一些Clojure代码,其中有一堆未初始化的值,如在Clojure中,有没有一种惯用的方法可以替代无双关语?,clojure,null,maybe,Clojure,Null,Maybe,我现在正在读一些Clojure代码,其中有一堆未初始化的值,如nil,用于传递记录中的数值 现在有很多Clojure图书馆。这意味着这是一个公认的惯例 但它也会导致NullPointerException,因为并非所有Clojure核心函数都可以将nil作为输入处理。(他们也不应该这样做) 其他语言有的概念,可能或选项在值为空时代理该值,以减轻空点异常风险。这在Clojure-中是可能的 您可以使用fnil执行一些技巧,但它并不能解决所有问题 另一种选择是简单地将未初始化的值设置为类似于:emp
nil
,用于传递记录中的数值
现在有很多Clojure图书馆。这意味着这是一个公认的惯例
但它也会导致NullPointerException
,因为并非所有Clojure核心函数都可以将nil
作为输入处理。(他们也不应该这样做)
其他语言有的概念,可能
或选项
在值为空时代理该值,以减轻空点异常
风险。这在Clojure-中是可能的
您可以使用fnil
执行一些技巧,但它并不能解决所有问题
另一种选择是简单地将未初始化的值设置为类似于:empty value
的符号,以强制用户在所有处理代码中显式地处理此场景。但这与nil
相比并不是一个很大的提升,因为直到运行时,您才真正发现所有场景(在其他人的代码中)
我的问题是:在Clojure中是否有一种惯用的方法来替代零双关语?不确定您是否在
零双关语
上读过这个lispcast,但我确实认为它很好地解释了为什么它是惯用的,并且涵盖了我在其他SO问题中没有提到的各种重要注意事项
基本上,nil
在clojure中是头等大事。尽管它具有固有的传统意义,但它是一种适当的价值观,可以在许多上下文中以上下文相关的方式进行处理。这使得它比宿主语言中的null
更加灵活和强大
例如,类似这样的内容甚至不会在java中编译:
if(null) {
....
}
在clojure中,(如果为nil…
可以正常工作。因此,在许多情况下,您可以安全地使用nil。我还没有看到一个java代码库,它不会到处都是if(foo!=null){…
这样的代码。也许Java8的可选
会改变这一点
我认为,在java互操作场景中,您很容易遇到问题,在这些场景中,您处理的是实际的null
s。在许多情况下,一个好的clojure包装库也可以帮助您避免这种情况,这是一个很好的理由,在可能的情况下,您更喜欢使用它而不是直接java互操作
有鉴于此,您可能需要重新考虑与这股潮流作斗争。但既然您正在询问替代方案,我认为这里有一个非常好的方案:。方案有一个可能方案(以及许多其他有用的方案),它在许多场景中都能很好地工作。这个库非常受欢迎,我也成功地使用了它。FWIW,这是在最近的一本书中推荐的。在Clojure中,有没有一种惯用的方法来替代无双关语
不。正如我所解释的,无双关语是一种惯用语。但它并不像普通的Lisp语言那样普遍,在普通的Lisp语言中(我被告知)一个空列表等于无
Clojure过去是这样工作的,但是处理列表的CL函数与处理序列的Clojure函数通常是相对应的。而且这些序列可能是惰性的,因此将惰性序列与其他序列统一起来是有好处的,这样就可以保留任何惰性。我认为这种演变发生在Clojure 1.2上。Rich对此进行了描述详细地说
如果你想要option/maybe类型,看看这个库。与Prismatic模式不同,它在编译时运行