lisp 里的相等(相同)的比较


common-lisp 里关于相等、相同的比较运算符太多了,怎么用呢?


eq   eql  qual  equalp  =   string-equal  char-equal 


怎么用呢?  一个大原则:  符号系统(symbol) 的比较用eq ,其他情况下可以用equal


下面看看 :

eq  只用来比较符号系统(symbol) 或者cons 但是只能跟自己比较。

CL-USER> (member 2 '(3 4 2 5 6))
(2 5 6)
CL-USER> (eq 'abc 'abc )
T
CL-USER> (eq 'abc "abc")
NIL
CL-USER> (eq 1 1)
T
CL-USER> (eq "abc" "abc")
NIL
CL-USER>

CL-USER> (eq '(1 2 3) '(1 2 3))
NIL


我们常规意义上的equal 都可以比对相等了,但是不用类型的是不能比较,例如  (equal 1 1.0)

CL-USER> (equal 'apple 'apple)
T
CL-USER> (equal "abc" "abc")
T
CL-USER> (equal 'abc "abc")
NIL
CL-USER> (equal 1 1)
T
CL-USER> (equal 1 1.0)
NIL
CL-USER> (equal '(1 2 3) '(1 2 3))
T
CL-USER> (equal (list 1 2 3) (cons 1 (cons 2 3)))
NIL
CL-USER> (equal (list 1 2 3) (cons 1 (cons 2(cons 3 nil))))
T
CL-USER> (equal #\a #\a)
T
CL-USER> (equal 2.3 2.3)
T
CL-USER>

我们常规意义上的equal 都可以比对相等了,但是不用类型的是不能比较,例如  (equal 1 1.0)



eql  可以比较  数字, 符号系统(symbol) 还有字符

CL-USER> (eql 1 1)
T
CL-USER> (eql 1.0 1)
NIL
CL-USER> (eql #\a #\a)
T
CL-USER> (eql 'abc 'abc)
T
CL-USER>


eql  也不能夸数据类型比较



equalp 可以比较很多我们看上去相等的数据,例如  1 = 1.0  “abc” = “ABC"

CL-USER> (equalp 1 1.0)
T
CL-USER> (equalp "abc" "ABC")
T
CL-USER> (equalp  'abc 'abc)
T
CL-USER> (equalp '(1 2 3) (list 1 2 3))
T
CL-USER> (equalp '(1 2 3) (cons 1(cons 2(cons 3 nil))))
T
CL-USER> (equalp 1 "1")
NIL
CL-USER> (equalp 1 #\1)
NIL

但是equalp 是不能夸" 大” 的数据类型的比如 数字1 与字符串 ”1“



字符串的比较 就 可以考虑专用的STRING-EQUAL
字符的比较 可以考虑专用的  char-equal









请使用浏览器的分享功能分享到微信等