Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中,有没有一种惯用的方法可以替代无双关语?_Clojure_Null_Maybe - Fatal编程技术网

在Clojure中,有没有一种惯用的方法可以替代无双关语?

在Clojure中,有没有一种惯用的方法可以替代无双关语?,clojure,null,maybe,Clojure,Null,Maybe,我现在正在读一些Clojure代码,其中有一堆未初始化的值,如nil,用于传递记录中的数值 现在有很多Clojure图书馆。这意味着这是一个公认的惯例 但它也会导致NullPointerException,因为并非所有Clojure核心函数都可以将nil作为输入处理。(他们也不应该这样做) 其他语言有的概念,可能或选项在值为空时代理该值,以减轻空点异常风险。这在Clojure-中是可能的 您可以使用fnil执行一些技巧,但它并不能解决所有问题 另一种选择是简单地将未初始化的值设置为类似于:emp

我现在正在读一些Clojure代码,其中有一堆未初始化的值,如
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模式不同,它在编译时运行