为了让自己更熟悉方案界面,我试图在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”。与该语言的许多其他方面一样,我不太精通计划中的字符串。我很确定问题出在或声明中,尽管我不知道在这种情况下会起作用的替代方案。我已经尝试过查找解决方案,但我还没有遇到任何符合此类描述的内容。有没有人知道代码的任何替代方案?
答案 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.")))