为什么有这么多方法来比较平等?

Gol*_*den 4 lisp comparison equality common-lisp

如果我想比较两个值是否相等,有多种选择,例如:

\n\n
    \n
  • eq对于符号
  • \n
  • =对于数字
  • \n
  • char-equal对于角色
  • \n
  • string-equal对于字符串
  • \n
  • eql用于符号、数字和字符串
  • \n
  • equal对于除符号之外的所有内容
  • \n
  • \xe2\x80\xa6
  • \n
\n\n

(我希望到目前为止我做对了。)

\n\n

现在,作为 Lisp 初学者,我的问题是:为什么会这样?这只是出于“历史原因”还是拥有所有这些可能性确实有好处?

\n\n

我知道为什么问题总是很难回答,并且可能是基于意见的,但我认为(猜测)高级 Lisp 开发人员普遍同意一些最佳实践。

\n

Syl*_*ter 5

之所以有这么多,是因为有专门针对某些类型进行优化的比较函数。使用它们可能会给您带来更好的性能。

我在《Land of Lisp》中读到的这个简单规则

  • 用于eq比较识别同一对象(指针相等)
  • 用于equal所有看起来相同的东西

现在有时您想测试一个字符串是否不区分大小写是否相等,然后equal不会这样做,因为“test”和“TEST”看起来不一样。string-equal将是正确的选择。

当比较不同类型的数字时,例如 3.0 和 3,它们看起来并不相同。然而,如果你(= 3 3.0)这样做T,因为如果fixnum被转换为浮点数,它们代表相同的值。

也equalp很像equal,除了它不区分字符串大小写和数字之类的=。我不完全确定,但在我看来第三条规则是:

  • 用于equalp表示相同含义的所有内容

因此,仅使用这 3 个通用运算符就可以取得很大的成果,但在某些情况下,您可能需要在CLHS中搜索专门的相等运算符。