Scheme - eq?比较两个字符串的区别是什么?

6
我在我的程序中遇到了一个问题。
我有一个比较两个字符串的条件:
(if (eq? (exp1) (exp2)))
当exp1给我一个字符串,而exp2也给我一个字符串。为确保准确性,当我将"eq?"改为"="时,它会给我下一个问题:
=: expects type as 2nd argument, given: ie; other arguments were: ie.
当我运行程序时,函数不会进入“if”函数中的第一个表达式,而是进入第二个表达式(表示条件为假)。
我该怎么办?
谢谢。

我的解释器有 string=? - knivil
当我将它改为"string=?"时,它给了我下一个问题: string=?:期望第1个参数是<string>类型,给定了:ie;其他参数是:ie。 但是"ie"是字符串,不是吗? - Tom
只是澄清一下 - "ie" 是一个长列表中的一个值,在执行 (car list) 后我得到了它。 - Tom
2
我认为你需要贴上更多的代码,这样我们才能进一步调试。 - dfan
抱歉,这不是问题所在。我无法删除这个问题。 - Tom
可能不太受欢迎的建议:为了获得良好的帮助,您需要将您的误解浓缩成一个非常小的程序,该程序的行为与您的期望不同。实际上,这样做通常会让您自己发现误解的来源。例如,在这种情况下,请尝试用实际值替换(exp1)。看看是否有助于您理解正在发生的事情。如果没有,那么请发布问题,您可能会得到更有帮助的回复。 - John Clements
2个回答

6
根据 R6RS 的 等价谓词 部分,您应该使用 equal? 而不是 eq?,后者测试的是其两个参数是否完全相同的对象(而不是具有相同值的两个对象)。
(eq? "a" "a")                           ; unspecified
(equal? "abc" "abc")                    ; #t

正如knivil在评论中指出的那样,字符串部分还提到了string=?,特别是用于字符串比较,这可能避免了进行类型检查。

谢谢,但我已经尝试过了。问题依旧存在。它进入了第二个表达式(意思是相等吗?即ie => false)。 - Tom

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"))

这与equal?有何不同? - newacct
@newacct所说的是 - 这是一个(非常晦涩)的实现,与equal?相同。顺便说一下,你可以直接使用#f#false(通常也是false),而不是(= 1 0) - Eli Barzilay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接