We might want more information than just the phone number in the phone
book. We could store birthdays as well, for example:
(define phone-and-birthday-book
'((barbara 775-1234 1-2-74) (luke 774-2839 6-12-81)
(nick 775-0912 3-5-22) (valerie 775-9043 9-1-71)))
Whenever we want the phone number stored in an entry, we will take the cadr of the entry. Whenever we want the birthday stored in an entry, we will take the caddr of the entry. It is more convenient and comprehensible to define functions that extract these elements of an entry rather than using chains of car's and cdr's:
(define number (lambda (entry) (cadr entry)))
(define birthday (lambda (entry) (caddr entry)))
Now Nick's phone number is:
(number (caddr phone-and-birthday-book))
(define name (lambda (entry) (car (car entry))))
(define number (lambda (entry) (cadr (car entry))))
(define birthday (lambda (entry) (caddr (car entry))))
(define phone-number
(lambda (person phone-and-birthday-book)
(cond [(null? phone-and-birthday-book) 'disconnected]
[(eq? person (name phone-and-birthday-book))
(number phone-and-birthday-book)]
[else (phone-number person (cdr phone-and-birthday-book))])))
(define name (lambda (entry) (car entry)))
(define number (lambda (entry) (cadr entry)))
(define birthday (lambda (entry) (caddr entry)))
To write the birth-date function, which returns someone's birthday.
Examples:
(birth-date 'luke '()) => dont-know
(birth-date 'barbara '((barbara 775-1234 1-2-74) (luke 774-2839 6-12-81))) => 1-2-74
Examples:
(vital-statistics number 'barbara
'((barbara 775-1234 1-2-74) (luke 774-2839 6-12-81))) => 775-1234
(vital-statistics birthday 'barbara
'((barbara 775-1234 1-2-74) (luke 774-2839 6-12-81))) => 1-2-74
(vital-statistics name 'barbara
'((barbara 775-1234 1-2-74) (luke 774-2839 6-12-81))) => barbara
Examples:
(phone-number 'valerie '3-5-22
'((valerie 775-9043 9-1-71) (nick 775-0912 3-5-22)
(valerie 774-9966 3-5-22) (valerie 774-5432 12-2-67)))
=> 774-9966
(phone-number 'valerie '3-5-52
'((valerie 775-9043 9-1-71) (nick 775-0912 3-5-22)
(valerie 774-9966 3-5-22) (valerie 774-5432 12-2-67)))
=> disconnected
Examples:
(phone-numbers 'valerie
'((valerie 775-9043 9-1-71) (nick 775-0912 3-5-22)
(valerie 774-9966 9-1-71) (valerie 774-5432 9-1-71)))
=> (775-9043 774-9966 774-5432)
(phone-numbers 'luke
'((valerie 775-9043 9-1-71) (nick 775-0912 3-5-22)
(valerie 774-9966 9-1-71) (valerie 774-5432 9-1-71)))
=> ()
Note that the case for the empty list no longer returns disconnected!