Scheme的eq? equal? eqv? [转]

Scheme语言中可以用<,>,<=,>=,= 来判断数字类型值或表达式的关系,如判断变量x是否等于零,它的形式是这样的:(= x 0) ,如x的值为0则表达式的值为#t,否则为#f。

还有下面的操作:

(eqv? 34 34)   =>  #t
(= 34 34)      =>  #t

以上两个form功能相同,说明 eqv? 也可以用于数字的判断。

在Scheme语言中有三种相等的定义,两个变量正好是同一个对象;两个对象具有相同的值;两个对象具有相同的结构并且结构中的内容相同。除了上面提到的符号判断过程和eqv?外,还有eq?和equal?也是判断是否相等的过程。

eq?,eqv?,equal?

eq?,eqv?和equal?是三个判断两个参数是否相等的过程,其中eq?和eqv?的功能基本是相同的,只在不同的Scheme语言中表现不一样。

eq?是判断两个参数是否指向同一个对象,如果是才返回#t;equal?则是判断两个对象是否具有相同的结构并且结构中的内容是否相同,它用eq?来比较结构中成员的数量;equal?多用来判断点对,列表,向量表,字符串等复合结构数据类型。

guile> (define v (vector 3 4 5))
guile> (define w #(3 4 5))  ; w和v都是vector类型,具有相同的值#(3 4 5)
guile> (eq? v w)
#f					; 此时w和v是两个对象
guile> (equal? v w)
#t                  ; 符合equal?的判断要求

以上操作说明了eq? 和equal? 的不同之处,下面的操作更是证明了这一点:

guile> (define x (make-vector 5 6))
guile> x
#(6 6 6 6 6)
guile> (eq? x x)    ; 是同一个对象,所以返回#t
#t
guile> (define z (make-vector 5 6))
guile> z
#(6 6 6 6 6)
guile> (eq? x z)    ; 不是同一个对象
#f
guile> (equal? x z)  ; 结构相同,内容相同,所以返回#t
#t

[转] http://os.chinaunix.net/a2003/1130/1057/000001057157.shtml

原文地址:https://www.cnblogs.com/longdouhzt/p/2752640.html