Scheme で null? 手続きを再実装

こんな感じかな。

(define null?
  (lambda (a)
    (eq? '() a)))


Scheme には等価性検証に eq?、eqv?、equal? が用意されているけど、

  • eq? は同一性
  • eqv? は甘めの同一性
  • equal? 同値性

という風に使い分ける。

Java で言うと、eq? は ==、equal? は equals(Object) だ。じゃあ eqv? は?

== よりも甘めで、equals(Object) よりも厳密、という立ち位置の eqv? は、いつ使えばよいのか僕にはよくわからない。


さて、null? の実装に戻ると、eq? で空リストと比較しているけど、これは 期待通り動作する。本来は同一性検証なので、オブジェクトが異なると #f を返しそうなものなんだけど、動作例が

(eq? '() '()) ; => #t

と R5RS に記載されている。

動的に生成された空リストでもよいようだ。

(eq? '() (list)) ; => #t
(eq? '() (cdr (list 1))) ; => #t


というか、なんで空リスト判定の名前が null? なんだろう?