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
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-751628/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/133735/viewspace-751628/