我想知道(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]))
答案 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
上使用cdr
和a
是安全的。
这不是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?
和car
与cdr
和first
的行为相同,但rest
和car
表示您可能会将某些内容视为一对两件事,而cdr
和first
清楚地表明您正在使用列表的意图。
您的代码,因为它似乎期望一个列表,应该是以下,因为,对于列表,如果它不是空列表,它必须是一个缺点。
rest
更一般地说,您编写的代码应该取决于您期望的输入类型。例如,在第一种情况下,可以检查是否为空,否则假设缺点,因为您期望列表。在第二种情况下,您必须检查您可能会看到的所有不同类型的东西。
(define (f lst)
(cond
[(empty? lst) empty]
[else "do something]))