【问题标题】:Scheme - eq? compare between 2 strings?方案 - eq?比较2个字符串?
【发布时间】:2012-01-11 05:59:41
【问题描述】:

我的程序有问题。

我有一个比较两个字符串的条件:

(如果 (eq?(exp1) (exp2)))

当exp1给我一个字符串,exp2给我一个字符串。可以肯定的是,当我改变“eq?”到“=”,它给了我下一个问题:

=: 期望类型 为第二个 参数,给定:即;其他论点 是:即。

当我运行程序时,函数进入“if”函数中的第一个表达式,并进入第二个表达式(即条件为假)。

我能做什么?

谢谢。

【问题讨论】:

  • 我的解释器有string=?
  • 当我将它更改为“string=?”时,它给了我下一个问题:string=?: 期望类型 作为第一个参数,给定:ie;其他论点是:即。但是“ie”是一个字符串,不是吗?
  • 澄清一下——“ie”是一长串列表中的值之一,我是在完成之后才知道的(汽车列表)
  • 我认为您将不得不粘贴更多代码,以便我们能够进一步调试。
  • 抱歉,这不是问题所在。我无法删除问题。

标签: scheme


【解决方案1】:

根据 R6RS 的Equivalence predicates 部分,您应该使用equal?,而不是eq?,而是测试它的两个参数是否是完全相同的对象(不是具有相同值的两个对象)。

(eq? "a" "a")                           ; unspecified
(equal? "abc" "abc")                    ; #t

作为评论中的 knivil 注释,Strings 部分还提到了string=?,专门用于字符串比较,这可能避免进行类型检查。

【讨论】:

  • 谢谢,但我试过了。同样的问题。它进入第二个exp(意思是相等?即ie => false)
【解决方案2】:

我为这个问题写了一个小辅助函数。

; 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 所说的——这是一个(非常模糊的)实现,与equal? 的工作方式相同。顺便说一句,您可以直接使用#f#false(通常也使用false),而不是(= 1 0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2015-06-14
  • 2012-08-16
相关资源
最近更新 更多