null?、pair?、list? 手続き

Scheme にはリストの種類を判別するための手続きは、3 つある。

null?
(null? '())    ; => #t
(null? (list)) ; => #t
(null? '(a))   ; => #f
(null? 'a)     ; => #f

null? 手続きは、とにかく空リストだった場合は #t を返す。

pair?
(pair? '())      ; => #f
(pair? '(a))     ; => #t
(pair? '(a b))   ; => #t
(pair? '(a . b)) ; => #t
(pair? 'a)       ; => #f

pair? 手続きは、空リスト以外のペアなら #t を返す。厳密には空リストはペアではないので「空リスト以外のペア」という表現はおかしい。

list?
(list? '())      ; => #t
(list? '(a))     ; => #t
(list? '(a b))   ; => #t
(list? '(a . b)) ; => #f
(list? 'a)       ; => #f

list? 手続きは、空リストを含むリストなら #t を返す。表現が難しいんだけど、リストの最後が空リストなら #t になる、という理解でよいはず。逆に言うと、空リストで終わらないものは、リストではない、ということになる。