要素のリスト'(abc)があり、その中に(trueまたはfalse)xが含まれているかどうかを調べたいと思います。たとえば、xは'aまたは'dになります。このための組み込み関数はありますか?
5 に答える
組み込み等価演算子のいずれかを使用して比較する必要がある場合はmemq
、 、memv
、またはmember
を使用して同等性を探すかどうかに応じてeq?
、 、eqv?
、またはequal?
をそれぞれ使用できます。
> (memq 'a '(a b c))
'(a b c)
> (memq 'b '(a b c))
'(b c)
> (memq 'x '(a b c))
#f
ご覧のとおり、これらの関数は、要素が見つかった場合、最初に一致した要素から始まるサブリストを返します。#f
これは、ブール値を含む可能性のあるリストを検索する場合、探している要素が見つからない場合と見つからない場合を区別できる必要があるためです。リストは真の値です (Scheme での唯一の偽の値は です) ため、 、、、または式などのブール値を期待する任意のコンテキストで、 、、または#f
の結果を使用できます。memq
memv
member
if
cond
and
or
> (if (memq 'a '(a b c))
"It's there! :)"
"It's not... :(")
"It's there! :)"
3つの異なる機能の違いは何ですか? それは、比較に使用する等価関数に基づいています。eq?
(したがってmemq
) 2 つのオブジェクトが同じ基になるオブジェクトであるかどうかをテストします。これは基本的にポインタ比較 (または整数の場合は直接値比較) と同等です。したがって、同じように見える 2 つの文字列またはリストはeq?
、メモリ内の異なる場所に格納されているため、そうではない場合があります。equal?
(したがってmember?
) はリストと文字列の詳細な比較を実行するため、基本的に、同じものを出力する 2 つの項目はすべて になりますequal?
。数字以外のほとんどすべてeqv?
に似ています。eq?
数値の場合、数値的に等しい 2 つの数値は常に になりますが、そうeqv?
ではない場合もあります。eq?
(これは、bignum と有理数が原因であり、それらが にならないような方法で格納される可能性がありますeq?
)
> (eq? 'a 'a)
#t
> (eq? 'a 'b)
#f
> (eq? (list 'a 'b 'c) (list 'a 'b 'c))
#f
> (equal? (list 'a 'b 'c) (list 'a 'b 'c))
#t
> (eqv? (+ 1/2 1/3) (+ 1/2 1/3))
#t
(関数の動作の一部は仕様で定義されていないため、実装ごとに異なる場合があることに注意してください。正確な有理数を実装する R 5 RS 互換のスキームで動作するはずの例を含めました)
組み込みのものとは異なる等価述語を使用してリスト内の項目を検索する必要がある場合は、find
またはfind-tail
SRFI-1 から:
> (find-tail? (lambda (x) (> x 3)) '(1 2 3 4 5 6))
'(4 5 6)
これが1つの方法です:
> (cond ((member 'a '(a b c)) '#t) (else '#f))
#t
> (cond ((member 'd '(a b c)) '#t) (else '#f))
#f
memberは、要素がある場所、または#fから始まるすべてを返します。condは、これをtrueまたはfalseに変換するために使用されます。
あなたは「見つける」を探しています
基本-最も単純なケースは(エントリリストを見つける)だけで、通常は述語として使用されます:「エントリはリストにありますか?」。問題の要素の検索に成功すると、「t」だけでなく、最初に一致する要素が返されます。(2番目のリンクから取得。)
http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node145.html
-また-
組み込み関数があるかどうかはわかりませんが、作成できます。
(define (occurrence x lst)
(if (null? lst) 0
(if (equal? x (car lst)) (+ 1 (occurrence x (cdr lst)))
(occurrence x (cdr lst))
)
)
)
Ỳou はx
、リスト内の の出現回数を返します。true
またはで拡張することもできfalse
ます。