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? なんだろう?