リストから要素を探す


Tags: リスト, R6RS

あるオブジェクトと equal? なオブジェクトをリストから探索するには member 手続きを使う。

(import (rnrs))

(member "bc" '("ab" "bc" "cd")) ; => ("bc" "cd")
(member 'b '(a c e g)) ; => #f

member 手続きは指定の要素が見つかった場合は、リストのその要素から始まる部分を返し、さもなくは #f を返す。比較手続きに eqv?eq? を使う場合には memvmemq を使う。自分で比較手続きを指定した場合には memp を使う。

(import (rnrs))

(memv 1 '(4 2 1 3)) ; => (1 3)
(memq 'a '(f d s a)) ; => (a)

(memp even? '(1 2 3 4)) ; => (2 3 4)
(memp (lambda (x) (eqv? x 1)) '(4 2 1 3)) ; => (1 3)
                                          ; === (memv 1 '(4 2 1 3)

指定した述語を満たす要素そのものを返して欲しい場合には find 手続きを使う。

(import (rnrs)

(find even? '(1 2 3 4)) ; => 2
(find negative? '(1 2 3 4)) ; => #f

ただし、 find 手続きは述語を満たす要素が #f であった場合と要素が見つからなかった場合を区別できない。

(import (rnrs))

(find not '(0 1 #f #t)) ; => #f
(find not '()) ; => #f