为什么在Clojure中Zero不是假的?

时间:2015-09-24 12:36:19

标签: clojure conditional

因此,在弱类型C(IIRC)中,0在布尔上下文中被评估为false(如条件表达式),其他一切都是真实的。现代动态语言似乎分为零是否为假:python,php和javascript说yes / ruby​​,lua,clojure和racket说不。

问题是,为什么?我用Google搜索了我的问题标题,并在黑客新闻中找到this帖子,其中有一些有趣的内容,但不是我的问题的答案。代替' lisp'因为我的搜索中的clojure没有得到任何历史参考。

因此,为了更准确地提出我的问题:是否有一个实际的技术优势,在条件表达式中将其评估为真,或者它只是在动态语言中成为准标准(不受影响C)礼貌的早期lisps?对于习惯于C / python / javascript的程序员来说,这肯定有点奇怪。

3 个答案:

答案 0 :(得分:4)

主要原因是因为很多Clojure功能都希望能够轻松地告诉他们什么都没有"除了"某事"。 nil缺少值,但数字0具有实际值。空列表也是真实的,它是一个可以(例如)conj编辑的序列。 (虽然因为Clojure允许你(conj nil 1)这可能不是最好的例子。)

但关键的区别在于0不是"没有",它""某些"。只有"没有" (和布尔false)在Clojure中将是假的。它是一种不同的虚假思维方式,当你来自Python背景时(例如我也是如此)它可能会很刺耳,但我实际上发现它比Python更有用#39虚假的机制。

答案 1 :(得分:1)

嗯,答案是肯定和否定,据我所知,将零评估为非假值的唯一好处是将“特殊”特征保留为Null(或None)。

例如,在Python中,不仅0None为假 - 而且还有空列表([])和空字符串('')。这允许一个非常易读的代码(大多数时候),但是如果你想要覆盖任何一个,那么它必须做一些特定的测试。

答案 2 :(得分:1)

刺穿许多语言的一个常见习语是语言需要什么来代表什么。 C是直接使用指针的低级别高级语言之一,因此将nothing设置为不可能的地址似乎是合乎逻辑的,因此0指针意味着{{1 }}。并且地址可以被视为(实际上是)数字。在Java中有nothing,在Clojure中有null代表什么。

另一方的问题是:我们应该将nilsomething视为nothing值吗?在C中,最初没有bool类型,所以他们不得不考虑bool(实际上可能反过来:falsesomething所以我们不要t需要布尔类型)。在Clojure中有一个nothing类型,它与boolean不同,但简单的经验法则是这样的:“nilNothing”强制到{{1} }和false的其他人。所以0在Clojure中是FALSE。这样做主要是为了TRUE原始意识形态,并且,也许是因为时间表明,当你不想无所事事时这是常见的情况,所以你只需要检查它。