首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数结构定义

函数结构定义
EN

Stack Overflow用户
提问于 2013-02-05 11:43:21
回答 3查看 98关注 0票数 2

我正在尝试使函数

author-book

它给出一本书,产生这本书的作者。这是我为此创建的数据-

代码语言:javascript
复制
(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"))

我试过了

代码语言:javascript
复制
(define (author-of-book n)
        (audiobook-author n))

这只给了我有声读物的作者。有没有一种方法可以让我不必编写三个独立的函数就能得到其余部分的作者?(比如电子书-作者...)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-05 12:37:16

这是另一个可能的实现,只是比@jozefg的答案(测试和工作)略短一点:

代码语言:javascript
复制
(define (author-of-book b)
  ((cond [(audiobook? b) audiobook-author]
         [(hardcover? b) hardcover-author]
         [(ebook? b)     ebook-author])
   b))

cond表达式返回在每种情况下使用的正确过程,并将选择的过程应用于b。例如:

代码语言:javascript
复制
(author-of-book audiobook1)
=> "Suzanne Collins"

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

(author-of-book hardcover1)
=> "Jud White"
票数 2
EN

Stack Overflow用户

发布于 2013-02-05 12:12:15

代码语言:javascript
复制
(define (author-of-book b)
    (cond 
        [(audiobook? b) (audiobook-author b)]
        [(hardcover? b) (hardcover-author b)]
        [(ebook? b)     (ebook-author b)]))

这有点冗长,但也不是太糟糕。

票数 2
EN

Stack Overflow用户

发布于 2013-02-06 08:26:31

您有三个不同的结构,它们共享一个公共的子结构:这三个结构都有一个title和一个author。您可以在结构定义中对此共享进行编码:

代码语言:javascript
复制
(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))

我们已经清除了三个结构中的字段重复,并且作为额外的好处,我们可以简单地使用book-author来访问这三种图书中的任何一种的author字段。

代码语言:javascript
复制
> (book-author audiobook1)
"Suzanne Collins"
> (book-author ebook1)
"Veronica Roth"
> (book-author hardcover1)
"Jud White"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14699828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档