(缺点?列表名称)有什么作用



我想知道(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 单元格,您可以在其上调用 cdrcdr。 这是因为虽然

(cons? x) == (not (empty? x))

一般值不适用,列表为真。 也就是说,如果您已经知道lst是一个列表,那么

(cons? lst) == (not (empty? lst))

真的。 当我们谈论列表和缺点单元格时,有许多函数可以做同样的事情。 例如,empty?null?做同样的事情,但它们表示程序员的意图略有不同。 类似地,carcdrfirstrest做同样的事情,但carcdr表明您可能将某事视为一对两件事,而firstrest清楚地表明您正在使用列表的意图。

你的代码,因为它似乎需要一个列表,可能应该是下面的,因为对于一个列表,如果它不是空列表,它一定是一个缺点。

(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单元格,例如,对于某些foobar (cons foo bar)的东西。

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

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

这与empty?并不相反,因为当且仅当参数为空列表时empty?为真,所以(empty? 1) == (cons? 1) == #f .

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

相关内容

  • 没有找到相关文章

最新更新