我想确定一个列表是否只包含null. null?似乎是显而易见的选择:
> (null? null)
#t
但是andmap结束它并没有达到我的预期:
> (andmap null? '(null))
#f
是我误会null?还是andmap?我是 Racket 的新手,但根据文档,这似乎根本不正确。
你的问题是它'(null)不是一个包含null(即空列表)的列表。以下是一些可行的选项:
(andmap null? '(()))(andmap null? `(,null))或者(andmap null? (quasiquote (unquote null)))(andmap null? (list null)).发生了什么的解释:标识符null绑定到一个表示空列表的值。当你这样做时'null,这相当于(quote null)“给我一个代表标识符的符号,而不是它所代表的东西”(就像用自然语言引用)。
您可以通过使用表示 null 的文字'()或使用quasiquoteandunquote来“转义”回 Racket 来避免这种情况。
有关报价的更多信息,请参阅其上的指南条目。
问题不在于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