我想知道是什么(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?
检查该值是否是一个cons
单元格,例如,(cons foo bar)
用于 somefoo
和的东西bar
。
> (cons? 1)
#f
> (cons? '())
#f
> (cons? (list 1 2 3))
#t
> (cons? (cons 1 2))
#t
如果(cons? a)
为真,则可以安全使用car
and cdr
on a
。
当且仅当参数是空列表时,这与empty?
因为为真不是相反的,所以。empty?
(empty? 1) == (cons? 1) == #f
旁注:请不要PLEASE HELP!!
在您的问题标题中添加或类似内容,这里的每个人都很乐意提供帮助,但阅读起来有点令人讨厌。只是将来要记住的事情。欢迎来到 SO。
jozefg 的回答是正确地指出 that(cons? x)
与(not (empty? x))
, 通常不同,因为有些东西(例如数字)既不是 cons 单元格也不是空列表。
但是,您的变量是list-name
,因此您可能有理由期望它的值实际上是一个列表。在 Scheme 中,列表是:
car
的first
元素。cdr
rest
正因为如此,如果您正在编写一个需要传入列表的函数,那么使用简单地检查琐碎的情况(空列表)empty?
并假设是有意义的,因为您需要一个列表,任何与这种情况不匹配的东西都是一个 cons 单元格,您可以在其上调用cdr
and cdr
。这是因为虽然
(cons? x) == (not (empty? x))
一般来说,值不正确,列表是正确的。也就是说,如果您已经知道这lst
是一个列表,那么
(cons? lst) == (not (empty? lst))
是真的。当我们谈论列表和 cons 单元格时,有许多函数可以做同样的事情。例如,empty?
做null?
同样的事情,但它们表明程序员的意图略有不同。同样,car
and 和 andcdr
做同样的事情first
,rest
但是car
andcdr
表示您可能将某件事视为一对两件事,而first
andrest
清楚地表明您正在使用列表的意图。
您的代码,因为它似乎需要一个列表,所以可能应该如下,因为对于一个列表,如果它不是空列表,它必须是一个缺点。
(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 ...