0

我想知道是什么(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]))
4

2 回答 2

1

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)为真,则可以安全使用carand cdron a

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

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

于 2013-12-02T18:52:01.977 回答
1

jozefg 的回答是正确地指出 that(cons? x)(not (empty? x)), 通常不同,因为有些东西(例如数字)既不是 cons 单元格也不是空列表。

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

  • 空列表;或者
  • 一个 cons 单元格,它是列表的元素,其是列表carfirst元素。cdrrest

正因为如此,如果您正在编写一个需要传入列表的函数,那么使用简单地检查琐碎的情况(空列表)empty?并假设是有意义的,因为您需要一个列表,任何与这种情况不匹配的东西都是一个 cons 单元格,您可以在其上调用cdrand cdr。这是因为虽然

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

一般来说,值不正确,列表正确的。也就是说,如果您已经知道这lst是一个列表,那么

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

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

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

(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 ...
于 2013-12-02T19:04:03.613 回答