我的程序有問題。Scheme - eq?比較兩個字符串?
我有2字符串之間比較的條件:
(?如果(EQ(EXP1)(EXP2)))
當EXP1給我一個字符串,EXP2給我一個字符串。可以肯定的是,當我更改「eq?」時爲 「=」,它給我的下一個問題:
=:預計鍵入<數>爲第 的說法,給出:即;其他論據 是:即。
當我運行程序,函數犯規中的「if」函數輸入到第一個表達式,然後輸入到第二個(意味着條件爲假)。
我該怎麼辦?
謝謝。
我的程序有問題。Scheme - eq?比較兩個字符串?
我有2字符串之間比較的條件:
(?如果(EQ(EXP1)(EXP2)))
當EXP1給我一個字符串,EXP2給我一個字符串。可以肯定的是,當我更改「eq?」時爲 「=」,它給我的下一個問題:
=:預計鍵入<數>爲第 的說法,給出:即;其他論據 是:即。
當我運行程序,函數犯規中的「if」函數輸入到第一個表達式,然後輸入到第二個(意味着條件爲假)。
我該怎麼辦?
謝謝。
根據R6RS的Equivalence predicates部分,您應該使用equal?
,不eq?
,這不是測試是否它的兩個參數是完全一樣的對象(而不是兩個對象具有相同的值)。
(eq? "a" "a") ; unspecified
(equal? "abc" "abc") ; #t
正如評論knivil便籤,Strings節還提到string=?
,專門用於字符串比較,這可能避免做一個類型檢查。
謝謝,但我試過了。一樣的問題。它進入第二個exp(意思是等於?ie ie => false) – Tom 2011-04-20 13:08:35
我爲這個問題寫了一個小幫手函數。 ?
; 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"))
這與「equal」有什麼不同? – newacct 2012-01-11 03:39:51
@newacct說什麼 - 這是一個(非常模糊的)實現,它與'equal? 。順便說一句,你可以直接使用'#f'或'#false'(通常也是'false'),而不是'(= 1 0)'。 – 2012-01-11 07:29:43
我的翻譯有'字符串=' – knivil 2011-04-20 12:59:56
當我把它改爲「?字符串=」,它給我的下一個問題:字符串=?:預計鍵入作爲第一個參數,給出:即;其他論點是:即。但「ie」是一個字符串,不是? –
Tom
2011-04-20 13:05:15
只是澄清 - 「ie」是一個長列表中的值之一,我得到它後我做了(汽車列表) – Tom 2011-04-20 13:05:47