4

私は、カリフォルニア大学バークレー校のサイトで2011年からブライアンハーベイのSICP講義をフォローしています。彼はSTkインタープリターを使用してクラスを教えており、私はDrRacketを備えたラケットを使用してフォローしています。私は、追加の練習のために、ラケットで定義されていないクラスで使用するすべての関数(つまり、、、)を定義しようとしていwordます。butfirstbutlast

を定義しようとして問題が発生しましたmember?。彼はリストや文字列でそれを使用して、次のようなことをすることができます

(member? 1 (list 1 2 3 4)) ;; works
(member? 'a '(a e i o u)) ;; works
(member? 7 17) ;; doesn't work
(member? #\e "Hello") ;; doesn't work

member?上記が機能する/機能しない私の定義は次のとおりです。

(define (member? u lst)
  (not (equal? (member u lst) #f)))

つまり、これはリストで機能しているので、最初の2つは機能していることを意味します。member?STkで模倣する関数を作成することさえ可能ですか?ドキュメントを見ていましたが、文字列、リスト、非負の整数など、さまざまなものがsequenceデータ型として定義されているようですが、関連するシーケンス関数が見つかりません。

4

2 に答える 2

4

これに使用できますsequence-ormap

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

テストする:

> (member? 7 17)
#t
> (member? #\e "Hello")
#t
于 2013-03-18T14:57:51.753 に答える
1

ここでラケット関数sequence-ormapがSchemeの学習に役立つことがわかったので、次のようにします。

(define (member? test item sequence)
  (cond ((string? sequence) (member? test item (string->list sequence)))
        ((vector? sequence) (member? test item (vector->list sequence)))
        ;; ...
        ((list? sequence) 
         (let looking ((l sequence))
           (and (not (null? l))
                (or (test item (car l))
                    (looking (cdr l))))))
        (else 'not-a-sequence)))

(define (member?-using-test test)
  (lambda (item sequence) (member? test item sequence))

(define member-equal? (member?-using-test equal?))
于 2013-03-18T15:15:32.500 に答える