在CL,我们有很多运营商检查平等依赖于数据类型: =,string-equal,char=,然后equal,eql和诸如此类的东西,所以对其他数据类型,并为运营商比较相同(编辑不要忘记回答这些请:)我们是否有通用的<,>等?我们可以让它们为另一个对象工作吗?)
然而,该语言具有使它们成为通用的机制,例如,如Common Common Lisp中所述的泛型(defgeneric,defmethod).我想象同样的==运算符,至少可以处理整数,字符串和字符!
已朝这个方向努力:https://common-lisp.net/project/cdr/document/8/cleqcmp.html
我认为这是一个主要的挫折,甚至是墙,对于初学者(我是其中),特别是我们来自其他语言,如python,我们使用一个相等运算符(==)进行每个相等检查(借助于对象)在自定义类型上做到这一点).
我今天看了一篇博客文章(不是monad教程,很棒的系列).那个家伙当然也有其他原因搬到了Clojure,那里有一个(或两个?)运营商.
那为什么会这样呢?有什么好理由吗?我甚至找不到第三方图书馆,甚至连CL21都找不到.编辑:当然,cl21有这种通用运算符.
在其他SO问题上,我读到了关于性能 首先,这不适用于我会写的小代码,所以我不在乎,如果你这么认为,你有没有数字可以说明你的观点?
编辑:尽管答案的基调,看起来没有 ;)我们在评论中讨论.
肯特·皮特曼写了一篇有趣的文章来解决这个问题:Lisp中的最佳意图,平等权利和错误.
并且还要注意,它适用于整数,字符串和字符.也适用于列表,向量和散列表以及其他Common Lisp类型但对象...对于某些工作定义.页面末尾的注释对您的问题有一个很好的答案:EQUAL EQUALPEQUALP
对象相等不是具有唯一确定的正确算法的概念.只能在某些特定程序的需要的背景下判断等式谓词的适当性.虽然这些函数采用任何类型的参数,并且它们的名称听起来非常通用,但是equop和equalp并不适用于每个应用程序.
特别注意我的上一个"作品"定义中有一个技巧.
是的我们有!eq适用于所有值,它始终有效.它完全不依赖于数据类型.这正是你要找的.它就像ispython中的运算符.它一定是你想要的?所有其他人都同意eq它的时间t,但它们往往是t完全不同的价值观,具有不同程度的相似性.
(defparameter *a* "this is a string")
(defparameter *b* *a*)
(defparameter *c* "this is a string")
(defparameter *d* "THIS IS A STRING")
Run Code Online (Sandbox Code Playgroud)
所有这些都是equalp因为它们含有相同的含义.equalp也许是最平等的功能.我不认为2和2.0是相同的,但equalp确实如此.在我的脑海2里2,2.0是在1.95和之间的某个地方2.04.你看他们不一样了.
equal理解我 (equal *c* *d*)绝对nil是好的.但是它返回t的(equal *a* *c*)为好.两者都是字符数组,每个字符都是相同的值,但是这两个字符串不是同一个对象.他们碰巧看起来一样.
请注意,我在这里使用字符串表示每一个字符串.我们有4个相同的函数,告诉你两个值是否有共同点,但只eq告诉你它们是否相同.
这些都不是特定类型的.它们适用于所有类型,但它们不是泛型,因为它们在语言中添加之前很久就已存在.你可以制作3-4个通用的相同功能,但它们真的会比我们已经拥有的更好吗?
A\xc2\xa0newer 库向标准 Common Lisp 函数添加通用接口: https: //github.com/alex-gutev/generic-cl/
\n\n\n\n\nGENERIC-CL 提供了 Common Lisp 标准中各种函数的通用函数包装器,例如等式谓词和序列操作。包装器的目标是为常见操作提供标准接口,例如测试两个对象的相等性,该接口可扩展为用户定义的类型。
\n
它对相等、比较、算术、对象、迭代器、序列、哈希表、数学函数、\xe2\x80\xa6 执行此操作
\n\n例如,人们可以定义自己的+运算符。