2

機能を作ろうとしています

author-book

本を与えられて、本の著者を生み出します。これのために私が作成したデータはここにあります-

(define-struct audiobook ( title author length-in-minutes voice-person))

(define-struct ebook ( title author size-in-kolobytes symbol ))

(define-struct hardcover (title author number-of-pages genre ))

(define audiobook1 (make-audiobook "The Hunger Games" "Suzanne Collins" "50 minutes" "David Larrson"))
(define audiobook2 (make-audiobook "Catching Fire" "Suzanne Collins" "55 minutes" "David Larrson"))
(define audiobook3 (make-audiobook "Mockingjay" "Suzanne Collins" "40 minutes" "David Larrson"))

(define ebook1 (make-ebook "Divergent" "Veronica Roth" "100000kbs" 'Kindle))
(define ebook2 (make-ebook "Dracula" "Bram Stocker " "134000kbs" 'Ebook))
(define ebook3 (make-ebook "Jane Eyre" "Charlotte Brontë " "400000kbs" 'IPad))

(define hardcover1 (make-hardcover "Pursued" "Jud White" "100000kbs" "Crime"))
(define hardcover2 (make-hardcover "Private Berlin" "James Patterson" "100000kbs" "Suspense"))
(define hardcover3 (make-hardcover "Francona" "Terry Francona" "100000kbs" "Sports"))

私はもう試した

(define (author-of-book n)
        (audiobook-author n))

これは私にオーディオブックだけの作者を与えます。3つの別々の関数を書かなくても、残りの作者を取得する方法はありますか?(ebook-authorのように...)

4

3 に答える 3

2

あなたはそれがどんな種類の本であるかをかなり簡単にチェックして、そこから行くことができます

(define (author-of-book b)
    (cond 
        [(audiobook? b) (audiobook-author b)]
        [(hardcover? b) (hardcover-author b)]
        [(ebook? b)     (ebook-author b)]))

これは少し冗長ですが、それほど悪くはありません。

于 2013-02-05T04:12:14.697 に答える
2

@jozefgの回答(テスト済みで動作中)よりも少し短い、別の可能な実装を次に示します。

(define (author-of-book b)
  ((cond [(audiobook? b) audiobook-author]
         [(hardcover? b) hardcover-author]
         [(ebook? b)     ebook-author])
   b))

cond式は、それぞれの場合に使用する正しいプロシージャを返し、選択されたプロシージャがに適用されますb。例えば:

(author-of-book audiobook1)
=> "Suzanne Collins"

(author-of-book ebook1)
=> "Veronica Roth"

(author-of-book hardcover1)
=> "Jud White"
于 2013-02-05T04:37:15.990 に答える
1

共通の下位構造を共有する3つの異なる構造体があります。3つすべてにとがtitleありauthorます。この共有は、構造体定義でエンコードできます。

(define-struct book (title author))

(define-struct (audiobook book) (length-in-minutes voice-person))
(define-struct (ebook book) (size-in-kolobytes symbol))
(define-struct (hardcover book) (number-of-pages genre))

3つの構造体のフィールドの重複をクリーンアップしました。追加のボーナスとしてbook-author、3種類の本のいずれかの著者フィールドにアクセスするために使用できます。

> (book-author audiobook1)
"Suzanne Collins"
> (book-author ebook1)
"Veronica Roth"
> (book-author hardcover1)
"Jud White"
于 2013-02-06T00:26:30.563 に答える