2011-04-20 139 views
4

我的程序有问题。Scheme - eq?比较两个字符串?

我有2字符串之间比较的条件:

(?如果(EQ(EXP1)(EXP2)))

当EXP1给我一个字符串,EXP2给我一个字符串。可以肯定的是,当我更改“eq?”时为 “=”,它给我的下一个问题:

=:预计键入<数>为第 的说法,给出:即;其他论据 是:即。

当我运行程序,函数犯规中的“if”函数输入到第一个表达式,然后输入到第二个(意味着条件为假)。

我该怎么办?

谢谢。

+0

我的翻译有'字符串=' – knivil 2011-04-20 12:59:56

+0

当我把它改为“?字符串=”,它给我的下一个问题:字符串=?:预计键入作为第一个参数,给出:即;其他论点是:即。但“ie”是一个字符串,不是? – Tom 2011-04-20 13:05:15

+0

只是澄清 - “ie”是一个长列表中的值之一,我得到它后我做了(汽车列表) – Tom 2011-04-20 13:05:47

回答

4

根据R6RS的Equivalence predicates部分,您应该使用equal?,不eq?,这不是测试是否它的两个参数是完全一样的对象(而不是两个对象具有相同的值)。

(eq? "a" "a")       ; unspecified 
(equal? "abc" "abc")     ; #t 

正如评论knivil便签,Strings节还提到string=?,专门用于字符串比较,这可能避免做一个类型检查。

+0

谢谢,但我试过了。一样的问题。它进入第二个exp(意思是等于?ie ie => false) – Tom 2011-04-20 13:08:35

0

我为这个问题写了一个小帮手函数。 ?

; test if eq? 
(define == 
    (lambda (x y) 
    (if (and (string? x) (string? y)) 
     (string=? x y) 
     (if (or (string? x) (string? y)) 
      (= 1 0) ;return false 
      (equal? x y))))) 
(define a "aString") 
(define l '("aString" "aOtherString")) 
(== (car l) a) ; true 
(== 1 1) ; true 
(== 1 0) ; false 
(== "a" 1) ; false diff. type 
(== "a" "b") ; false 
(== "a" "a") ; true 
(== '("a" "b") '("a" "b")) 
+0

这与“equal”有什么不同? – newacct 2012-01-11 03:39:51

+0

@newacct说什么 - 这是一个(非常模糊的)实现,它与'equal? 。顺便说一句,你可以直接使用'#f'或'#false'(通常也是'false'),而不是'(= 1 0)'。 – 2012-01-11 07:29:43