2011-04-20 47 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