3

我想确定一个列表是否只包含null. null?似乎是显而易见的选择:

> (null? null)
#t

但是andmap结束它并没有达到我的预期:

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

是我误会null?还是andmap?我是 Racket 的新手,但根据文档,这似乎根本不正确。

4

2 回答 2

8

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

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

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

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

有关报价的更多信息,请参阅其上的指南条目

于 2013-05-23T23:50:35.717 回答
4

问题不在于andmap,也不在于null?。这是您构建错误列表的方式。其实这个 list:'(null)等价于 this: (list 'null):

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

并且'null不一样null

(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
于 2013-05-24T00:03:28.287 回答