在Common Lisp中,如果我想检查列表是否为空,我可以简单地使用列表本身作为条件,因为所有非零列表都被认为是真的。但是,我发现在Scheme中,同样会让Scheme认为我正在尝试调用一个函数。是否有更好的方法来检查Scheme中的列表是否为空,而不是定义另一个执行(not (null? x))
的函数?
答案 0 :(得分:8)
在Scheme中,非#f
的所有内容都是真实的,因此'()
在#t
语句中被视为if
。
因此,
(if '() "true" "false") => "true"
(not '()) => #f
使用(not (null? x))
是检查列表是否为空的最简单的方法:它准确描述了您想要的内容,而在您给出的内容不是列表的极端情况下,它会给您不同的内容行为:
(if (not (null? #t)) "true" "false") => "true"
(if (not #t) "true" "false") => "false"
答案 1 :(得分:7)
如果您知道这是一个列表,则可以使用(pair? x)
,因为每个列表都是一对或'()
。