2016-11-25 2 views
2

メンバーを利用しようとしていますか?ユーザの入力における単語の特定のストリングの存在を決定する機能を有する。ラケットスキーム - メンバー?機能conundrum

メンバー?関数が使用されている:

(define (member? item seq) 
    (sequence-ormap (lambda (x) 
        (equal? item x)) 
        seq)) 

しかし、私のプログラムの構造は次の比較を行うために私を必要とします。

(?メンバー「(名前)」塁の(名前を))

その出力の例は以下の通りです:しかし、私が見る問題はこのことです

> (car (car *strong-cues*)) 
'((the names) (their names)) 
> (car (car (car *strong-cues*))) 
'(the names) 
> (member? (car (car (car *strong-cues*))) '(the names of the basemen)) 
#f 

「名前」(この場合は「塁の名前」である)、ユーザの入力に明確です〜です

「the or the names of or 'or or the basemen」には(名前)がありますか?

この比較を適切に行う方法はありますか?「名前」がユーザーの入力内にある文字列の場合、「名前」を検索するとtrueが返されます。

答えて

3

リスト内のサブリストを検索しているため、これは実際にはmemberではありません。そのため、ormapを使用することはできません。なぜなら、各繰り返しは複数の要素を比較することを期待している間に1つの要素しか持たないからです。私はあなたがprefix?を作るお勧め:

(define (prefix? what lst) 
    ; implementation left as exercise 
    <???>) 

(prefix? '(b c) '(a b c d)) ; ==> #f 
(prefix? '(b c) '(b c d)) ; ==> #t 

これは、検索リストが空になるまで、あなたが要素に要素を比較し、かなり単純な再帰ものです。いずれかの要素テストが偽であるか、または干草が空の場合、それは偽です。そして、あなたは簡単にそれでfind-sublistを行うことができます。

ここ
(define (find-sublist sub lst) 
    (cond ((null? lst) #f) 
     ((prefix? sub lst) lst) 
     (else (find-sublist sub (cdr lst)))))) 

(find-sublist '(c d) '(a b c d e f)) ; ==> (c d e f) 

メンバーが行うように私は、接頭辞を持つリストを返しますが、それは簡単にあなたがそれをしたいと思うものは何でも変更することができます。..インデックス、#t

+0

あなたの説明は簡単で有益です。どうもありがとうございました!! –