вопрос о структуре схемы - PullRequest
0 голосов
/ 01 мая 2010
;; definition of the structure "book"
;; author: string - the author of the book
;; title: string - the title of the book
;; genre: symbol - the genre
(define-struct book (author title genre))

(define lotr1 (make-book "John R. R. Tolkien" 
                         "The Fellowship of the Ring"
                         'Fantasy))
(define glory (make-book "David Brin"
                         "Glory Season"
                         'ScienceFiction)) 
(define firstFamily (make-book "David Baldacci"
                               "First Family"
                               'Thriller))
(define some-books (list lotr1 glory firstFamily))

;; count-books-for-genre:  symbol (list of books) -> number
;; the procedure takes a symbol and a list of books and produces the number           
;; of books from the given symbol and genre
;; example: (count-books-for-genre 'Fantasy some-books) should produce 1
(define (count-books-for-genre genre lob)  

 (if (empty? lob) 0
 (if (symbol=? (book-genre (first lob)) genre)
       (+ 1 (count-books-for-genre (rest lob) genre)) 
       (count-books-for-genre (rest lob) genre) 
     )     
  )      
 )             

(count-books-for-genre 'Fantasy some-books)

Сначала выдается следующее исключение first: ожидаемый аргумент типа непустого списка; учитывая «Фэнтези », я не понимаю, в чем проблема.

Может кто-нибудь дать мне какое-нибудь объяснение?

Большое спасибо!

1 Ответ

1 голос
/ 01 мая 2010

В рекурсивном вызове count-books-for-genre вы путаете порядок аргументов.

т.е. Вы передаете (rest lob) как первый аргумент (жанр), а жанр - как второй (lob). Таким образом, в первом рекурсивном вызове lob на самом деле представляет собой «Fantasy вместо (rest some-books)», и поэтому попытка использовать операции над списком приводит к неудаче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...