我的程序中存在问题。
我有一个比较2个字符串的条件:
(if(eq?(exp1)(exp2)))
当exp1给我一个字符串时,exp2给我一个字符串。当然,当我改变“eq?”时到“=”,它给了我下一个问题:
=:期望类型< number>作为第2 论证,给出:即;其他论点 是:即。
当我运行程序时,函数不进入“if”函数中的第一个表达式,并进入第二个表达式(意味着条件为false)。
我该怎么办?
谢谢。
答案 0 :(得分:5)
根据R6RS的Equivalence predicates部分,您应该使用equal?
,而不是eq?
,而不是测试它的两个参数是否完全相同(不是两个对象)相同的价值)。
(eq? "a" "a") ; unspecified
(equal? "abc" "abc") ; #t
作为评论中的文字说明,Strings部分还提到了string=?
,特别是字符串比较,这可能会避免进行类型检查。
答案 1 :(得分: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"))