为什么"不相等?"和类似的否定比较没有内置到Racket?

ohs*_*ite 7 scheme racket

在球拍(和其他计划,从我可以告诉),我所知道的唯一的方法来检查两件事情是否等于就是明确应用not的测试:

(not (= num1 num2)) 
(not (equal? string1 string2))
Run Code Online (Sandbox Code Playgroud)

显然(not (that-big-of-deal?)),但这是一种常见的结构,我觉得我必须忽略它没有内置的原因.

我想,一个可能的原因是你可以经常摆脱not使用unless而不是when,或通过在if语句中切换true/false分支的顺序.但有时候这并不能模仿你试图表达的推理.

此外,我知道否定的函数很容易定义,但是<=,例如,内置的函数也是如此.

什么是没有的东西喜欢的设计决策not-equal?,not-eqv?,not-eq?!=标准库?

Lei*_*sen 11

首先,你是正确的,它是(not (that-big-of-a-deal?))1

Racket没有开箱即用的原因很可能只是因为它增加了许多额外的原语而没有太大的好处.我承认很多语言确实!=不相同,但即使在Java中,如果你想使用equals()(类似于equal?Racket)进行深度相等检查,你必须自己手动反转结果!.

拥有<=>(以及>=<)几乎肯定足够方便使语言的原始设计者包含它.

所以不,没有任何深层原因可以解释为什么没有任何捷径可以在not-eq?Racket中内置功能.它只是增加了更多的原语,并没有增加太多的好处.特别是因为你仍然需要not自己存在.

1顺便说一句,我喜欢这种双关语.有一些虚构的互联网点.


Chr*_*ung 6

我确实想念没有not=程序(或?在@soegaard的评论中提到),但是not出于您的考虑。

所有数值比较运算符都是可变参数。例如,(< a b c d)与相同(and (< a b) (< b c) (< c d))。对于=,它将检查所有参数在数值上是否相等。但是没有检查所有参数是否均不相等的过程,这与不是所有参数都相等(这是什么(not (= a b c d))检查)的问题不同。

是的,您可以使用折叠模拟该过程。但是,嗯。


编辑:实际上,我只是在这方面回答了我自己的问题:缺少可变参数?过程的原因是,您不能仅使用n-1个成对比较来实现它,这与所有其他数值比较运算符不同。进行n-1个成对比较的直接方法意味着(? 1 2 1 2)将返回true,但这并没有真正的帮助。

我会保留原本的想法,以适应上下文以及其他想知道类似事情的人。