汽车/ cdr参数是列表......对吗?

时间:2018-04-12 22:29:13

标签: scheme racket quote type-mismatch cdr

我在Scheme中列出了名为chatbot的字符串列表。

chatbot中的每个列表元素都有字符串。我尝试使用不同的列表对这些字符串进行分类,这些列表都存储在名为chatbot的大列表中。 (对不起冗余)

为清楚起见,这是代码:

(define greetings '("string 1"
                    "string 2"
                    "string 3"
                    "string 4"))

(define cheerUpPhrases '("string 5"
                         "string 6"))

(define congratsPhrases '("string 7"
                          "string 8))

(define didNotUnderstand '("string 8"
                           "string 9"
                           "string 10"))

(define chatbot '(greetings cheerUpPhrases congratsPhrases didNotUnderstand))

我真的认为这没关系。但后来,在一个函数中,我想得到"字符串3"所以我试着这样做:

(caddar chatbot)

然后出现了这个错误:

caddar: contract violation
expected: (cons/c (cons/c any/c (cons/c any/c pair?)) any/c)
given: '(greetings cheerUpPhrases congratsPhrases didNotUnderstand)

不太确定这是什么意思,我改变了(caddar chatbot):

(third (car chatbot))

最后,我收到了这个错误:

third: contract violation
expected: list?
given: 'greetings

现在,我理解(第三)需要一个列表(实际上是对)才能工作;汽车/司机和类似功能也是如此。我毕竟不给它一个清单吗?我现在真的很困惑。

我刚开始使用Scheme和功能范例,所以我可能会遗漏一个基本的东西。如果你能解释我发生了什么,这对我真的有帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

关闭。问题是你滥用'

你知道,'(a b c)并没有扩展到像(list a b c)这样的东西,而是扩展到类似(list 'a 'b 'c)的东西。

因此,您不是插入列表greetingscheerUpPhrasescongratsPhrasesdidNotUnderstand,而是将它们实际上作为符号插入。

有两种简单的方法可以解决这个问题。您可以使用quasiquote `和取消引用,,也可以直接使用list。使用list重写代码(修复损坏的"string 8"会产生:

(define greetings '("string 1"
                    "string 2"
                    "string 3"
                    "string 4"))

(define cheerUpPhrases '("string 5"
                         "string 6"))

(define congratsPhrases '("string 7"
                          "string 8"))

(define didNotUnderstand '("string 8"
                           "string 9"
                           "string 10"))

(define chatbot (list greetings cheerUpPhrases congratsPhrases didNotUnderstand))

您现在可以看到chatbot变量包含您期望的实际列表:

> chatbot
'(("string 1" "string 2" "string 3" "string 4") ("string 5" "string 6") ("string 7" "string 8") ("string 8" "string 9" "string 10"))