andmap和null?返回假

时间:2013-05-23 23:17:20

标签: null scheme racket

我想确定列表是否仅包含nullnull?似乎是明显的选择:

> (null? null)
#t

但是andmap而不是我所期望的那样:

> (andmap null? '(null))
#f

我误解了null?还是andmap?我是Racket的新手,但这根本不适合基于文档。

2 个答案:

答案 0 :(得分:8)

您的问题是'(null) 包含null的列表(即空列表)。以下是一些可行的选项:

  • (andmap null? '(()))
  • (andmap null? `(,null))(andmap null? (quasiquote (unquote null)))
  • (andmap null? (list null))

说明发生了什么:标识符null绑定到表示空列表的值。当你执行'null时,这相当于(quote null),这意味着“给我一个代表标识符的符号,而不是代表它的符号”(就像用自然语言引用一样)。

您可以使用代表null '()的文字或使用quasiquoteunquote“转义”回Racket来避免这种情况。

有关引用的详细信息,请参阅其上的Guide entry

答案 1 :(得分:4)

问题不在andmapnull?。这就是你构建错误列表的方式。实际上,此列表:'(null)等同于:(list 'null)

(equal? '(null) (list 'null))
=> #t

'nullnull不同:

(equal? 'null null)
=> #f

因此,我们需要的是在列表中表达空值的正确方法。以下任何一种都可以使用:

(andmap null? '(()))
=> #t
(andmap null? (quote (())))
=> #t
(andmap null? (list '()))
=> #t
(andmap null? (list null))
=> #t
(andmap null? `(,null))
=> #t
(andmap null? (quasiquote (unquote null)))
=> #t