我想确定列表是否仅包含null
。 null?
似乎是明显的选择:
> (null? null)
#t
但是andmap
而不是我所期望的那样:
> (andmap null? '(null))
#f
我误解了null?
还是andmap
?我是Racket的新手,但这根本不适合基于文档。
答案 0 :(得分:8)
您的问题是'(null)
不包含null
的列表(即空列表)。以下是一些可行的选项:
(andmap null? '(()))
(andmap null? `(,null))
或(andmap null? (quasiquote (unquote null)))
(andmap null? (list null))
。说明发生了什么:标识符null
绑定到表示空列表的值。当你执行'null
时,这相当于(quote null)
,这意味着“给我一个代表标识符的符号,而不是代表它的符号”(就像用自然语言引用一样)。
您可以使用代表null '()
的文字或使用quasiquote
和unquote
“转义”回Racket来避免这种情况。
有关引用的详细信息,请参阅其上的Guide entry。
答案 1 :(得分:4)
问题不在andmap
或null?
。这就是你构建错误列表的方式。实际上,此列表:'(null)
等同于:(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