我想确定一个列表是否只包含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 的文字'()
或使用quasiquote
andunquote
来“转义”回 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