多个字符串之间的方案检查

时间:2012-12-21 15:42:30

标签: string scheme compare racket

为了让自己更熟悉方案界面,我试图在Dr.Batet编写一个程序(虽然与MIT Scheme兼容),它检查给定的各种不同的字符串,并根据什么返回相应的字符串提供。到目前为止我所拥有的是:

(define (conversation input)
    (cond ((eq? (or "hello Racket" "hi Racket" "what's up, Racket?" 
    "hey Racket" "what's happening, Racket?") input) "hey coder")
      (else "no hablo ingles.")))

*字符串之间的空间恰好适合这里。这是翻译中的一个长篇陈述。

如果我放入:

,那么期望的效果就是
(conversation "hello Racket")
(conversation "hi Racket")
(conversation "hey Racket")

他们都将返回相同的结果,即“嘿编码器”。然而,这不是正在发生的事情。唯一一个返回“嘿编码器”的人是(对话“hello Racket”)。所有其他人都返回“没有hable ingles”。与该语言的许多其他方面一样,我不太精通计划中的字符串。我很确定问题出在或声明中,尽管我不知道在这种情况下会起作用的替代方案。我已经尝试过查找解决方案,但我还没有遇到任何符合此类描述的内容。有没有人知道代码的任何替代方案?

2 个答案:

答案 0 :(得分:3)

or获取参数列表并检查其参数是否为“truthy”(不是#f)。如果是这样,它返回的第一个参数是真实的。如果没有,则返回#f。所以(or "string1" "string2" ...)只返回“string1”。所以你所做的就是检查给定的字符串是否等于“hello Racket”并忽略其他选项(你可能会在这里反对它也不适用于“hello Racket” - 我会这样做)。你想要做的是给or提供完整的条件,而不仅仅是字符串。所以它应该看起来像(or (eq? "string1" input) (eq? "string2" input) ...)

然而,这也不起作用。为什么不?因为eq?是用于比较字符串的错误函数。如果两个字符串驻留在内存中的相同位置,则它仅返回true。如果两个字符串驻留在不同的内存位置,但具有相同的内容,则返回#f。这也是您当前代码为“hello Racket”返回#f的原因。你应该使用的是equal?,它比较了字符串的内容。

现在应该可以使用,但它有点笨重 - 为每个可能的字符串重复调用equal?。一个更好的方法是创建一个包含有效字符串的列表,然后使用member函数检查输入字符串是否包含在列表中。

答案 1 :(得分:2)

您可以使用member程序和可能的选项列表达到预期的效果:

  

member找到lst的第一个元素是否相等?如果存在这样的元素,则返回以该元素开头的lst的尾部。否则,结果是#f。

这就是我的意思:

(define (conversation input)
  (cond ((member input '("hello Racket" "hi Racket" "what's up, Racket?"
                         "hey Racket" "what's happening, Racket?"))
         "hey coder")
        (else "no hablo ingles.")))