リスト内のすべての要素が整数であるかどうかをどのように確認しますか?(integer?(car list)を使用して最初の要素を確認できますが、(integer?(cdr list))を使用すると、リストの最後の部分全体が整数ではないため、常にfalse(#f)が返されます。グループとして。この場合、リストが次のように定義されているとします。(リストの定義'(1 2 5 4 5 3))
4 に答える
(define get-integers
(lambda (x)
(if (null? x)
"All elements of list are integers"
(if (integer? (car x))
(get-integers (cdr x))
"Not all elements are an integer"))))
実用的なスキームは、シーケンス全体にわたってテストを実行するための関数を提供します。たとえば、andmap関数の適用が適切です。ラケットは、同様のことを行うための/およびを提供します。本当に手動でループを書き出す必要がある場合は、再帰を使用します。
リスト内の各要素をテストして、条件(この場合は整数)を満たしているかどうかを確認する必要があります。整数のリストを評価するときは(integer? (car list))
、リストの最初の要素が整数であるかどうかをチェックしていますが、それで問題ありません。ただし、式はリストが整数である(integer? (cdr list))
かどうかをテストし(リストを返すため)、それは機能しません。リストの次の要素をテストする必要があり、リストが空になるまで次の要素をテストする必要があります。cdr
上記を行うにはいくつかの方法があります。最も簡単な方法は、リストを繰り返して各要素を順番にテストしfalse
、非整数要素が見つかったtrue
場合、またはすべてのリストが非整数要素を見つけずに消費された場合に返すことです。これ:
(define (all-integers? lst)
(cond ((null? lst) #t)
((not (integer? (car lst))) #f)
(else (all-integers? (cdr lst)))))
より実用的なアプローチは、次のような組み込みの手順を使用することです。
(andmap integer? lst)
andmap
のすべての要素が指定された述語に対してlst
評価されるかどうかをチェックします。true
例えば:
(andmap integer? '(1 2 3))
> #t
(andmap integer? '(1 "x" 3))
> #f
SRFI-1は、every
andany
ではなくandmap
andという用語を使用しormap
ます。match
使用することもできます:
(define list-of-integers?
(lambda (lst)
(match lst
(((? number?) ..1) #t)
(_ #f))))