我正在尝试将列表输入传递给会话并让函数检查以查看另一个列表(关键字)中的第一个元素是否与用户传入的列表的第一个元素匹配。如果两个匹配则输出否则以递归的方式将输入列表的尾部传递回自身。
(define keyword '(am I))
(define (conversation input)
(cond
((equal? (car keyword) (car input)) 0)
(else (conversation (cdr input)))))
我得到的错误是:
car: contract violation
expected: pair?
given: '()
我明白这是平等的吗?比较两个元素,一对,但我不明白为什么当两个列表的汽车都是一个元素时它会产生错误。任何帮助都会非常感激,我假设解决方案相当简单,但我似乎无法看到它。
我的目标是创建几个函数,模式匹配并输出适当的对话框,但不使用正则表达式或其他库。没有任何授权不使用上面提到的两个,但我想在没有它们的情况下这样做,以便更好地理解逻辑和代码。谢谢你的帮助!
答案 0 :(得分:0)
首先要考虑的是你没有失败的条件。您认为现在与car
匹配 ,或者稍后会与cdr
匹配。但可能根本没有匹配,您将cdr
在列表中'()
,直到您的列表为car
。由于'()
#f
没有这样的东西,当你试图提取它时,你会收到错误。因此,首先要做的是确保你已经处理过这种情况。我不知道你打算在这种情况下做什么,所以我让程序返回0
。
接下来,考虑符号匹配时该怎么做。在您的情况下,您选择返回car
。这部分似乎没有问题。
最后,我们考虑如果(define (conversation input)
(cond ((null? input) #f)
((eq? (car input) (car keyword))
0)
(else
(conversation (cdr input)))))
不匹配该怎么办。在这种情况下,我们继续搜索输入。这部分似乎没有问题。
if let cell = sender as? PollCell {
pollViewController.passLabel.text = cell.pollQuestion.text
}