lisp 裡的相等(相同)的比較

babyyellow發表於2012-12-25

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章