什么(cons?list-name)呢?

时间:2013-12-02 18:48:05

标签: list scheme short cons

我想知道(cons? list-name)做了什么。它只是检查list-name是不是非空列表吗?它是否与(empty? list-name)相反?如果是这样,那么仅仅说(empty? list-name)然后说else而不是cons?是不是更好?例如:

(define (f list-name)
   (cond
     [(empty? list-name) empty]
     [(cons? list-name) "do something]))

2 个答案:

答案 0 :(得分:1)

cons?检查该值是否为cons单元格,例如某些(cons foo bar)foo bar的内容。

> (cons? 1)
#f
> (cons? '())
#f
> (cons? (list 1 2 3))
#t
> (cons? (cons 1 2))
#t

如果(cons? a)为真,那么在car上使用cdra是安全的。

这不是empty?的反面,因为当且仅当参数是空列表时,empty?才为真,所以(empty? 1) == (cons? 1) == #f

旁注:请不要在问题标题中加上PLEASE HELP!!或类似内容,这里的每个人都很乐意提供帮助,但阅读时有点讨厌。这是将来要记住的事情。欢迎来到SO。

答案 1 :(得分:1)

jozefg's answer正确指出(cons? x)(not (empty? x))不一样,因为有些东西(例如,数字)既不是缺点也不是空列表。

但是,您的变量为list-name,因此您可能有理由期望其值实际上是一个列表。 Scheme中的列表是:

  • 空列表;或
  • 一个缺点单元格,其car是列表的first元素,其cdr是列表的rest

因此,如果您正在编写一个需要传入列表的函数,那么 就可以简单地检查{{1}的简单案例(空列表)因为你需要一个列表,所以任何与这种情况不匹配的东西都是一个cons单元格,你可以在其上调用empty?cdr。这是因为

cdr

通常不是值,列表的为真。也就是说,如果您已经知道(cons? x) == (not (empty? x)) 是一个列表,那么

lst

true 。当我们讨论列表和缺陷单元时,有许多函数可以执行相同的操作。例如,(cons? lst) == (not (empty? lst)) empty?做同样的事情,但它们表示程序员的意图略有不同。同样,null?carcdrfirst的行为相同,但restcar表示您可能会将某些内容视为一对两件事,而cdrfirst清楚地表明您正在使用列表的意图。

您的代码,因为它似乎期望一个列表,应该是以下,因为,对于列表,如果它不是空列表,它必须是一个缺点。

rest

更一般地说,您编写的代码应该取决于您期望的输入类型。例如,在第一种情况下,可以检查是否为空,否则假设缺点,因为您期望列表。在第二种情况下,您必须检查您可能会看到的所有不同类型的东西。

(define (f lst)
   (cond
     [(empty? lst) empty]
     [else "do something]))