我的程序有问题。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