我想知道(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]))
约瑟夫的回答是正确的,指出(cons? x)
与(not (empty? x))
不同,一般来说,因为有些东西(例如,数字(既不是缺点单元格也不是空列表。
但是,您的变量是list-name
的,因此您可能有理由期望它的值实际上是一个列表。 方案中的列表是:
- 空列表;或
- 一个 cons 单元格,其
car
是列表的first
元素,其cdr
是列表的rest
。
因此,如果您正在编写一个需要传入列表的函数,那么只需使用 empty?
检查琐碎情况(空列表(是有意义的,并假设,既然您需要一个列表,任何与该情况不匹配的东西都是一个 cons 单元格,您可以在其上调用 cdr
并cdr
。 这是因为虽然
(cons? x) == (not (empty? x))
一般值不适用,列表为真。 也就是说,如果您已经知道lst
是一个列表,那么
(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]))
更一般地说,您编写的代码应取决于您期望的输入类型。 例如,在第一种情况下,可以检查空,否则假设缺点,因为您期待一个列表。 在第二种情况下,你必须检查你可能看到的所有不同类型的东西。
(define (frob-list lst)
(cond
[(empty? lst) empty] ; arg is ()
[else ...])) ; arg is (x . y)
(define (frob-object obj)
(cond
[(null? obj) ...] ; arg is ()
[(cons? obj) ...] ; arg is (x . y)
[(number? obj) ...] ; arg is r
... ; arg is ...
[else ...])) ; else ...
cons?
检查该值是否是cons
单元格,例如,对于某些foo
和bar
(cons foo bar)
的东西。
> (cons? 1)
#f
> (cons? '())
#f
> (cons? (list 1 2 3))
#t
> (cons? (cons 1 2))
#t
如果(cons? a)
为真,那么在a
上使用car
和cdr
是安全的。
这与empty?
并不相反,因为当且仅当参数为空列表时empty?
为真,所以(empty? 1) == (cons? 1) == #f
.
旁注:请不要在你的问题标题中加上PLEASE HELP!!
或类似的东西,这里的每个人都很乐意提供帮助,但读起来有点讨厌。只是将来要记住的事情。欢迎来到SO。