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