(define filter
(lambda (proc lst)
(cond ((null? lst) '())
((proc (car lst)) (cons (car lst) (filter proc (cdr lst))))
(else
(filter proc (cdr lst))))))
(define find-zip
(lambda (zip lst)
(define match (filter (lambda (item) (= zip (car item))) lst))
(if (null? match)
'()
(cdar match))))
(define (find zip)
(find-zip zip zipcode))
Я думаю, что это будет работать для вас. Фильтр будет применять свой первый аргумент (процедуру) к каждому элементу в своем втором аргументе, который должен быть списком. Первый аргумент должен возвращать логическое значение для каждого передаваемого элемента. Затем фильтр вернет список со всеми элементами, которые вернули true, когда был применен первый аргумент. В противном случае возвращается пустой список.
В этом случае каждый элемент в списке, который вы передаете, сам является списком из 3 элементов, поэтому он сравнивает первый элемент в этом списке с искомым почтовым индексом. Если это совпадение, оно возвращает true. Поэтому, если почтовый индекс находится в списке, он вернет подсписок из трех элементов. Затем мы проверяем, получили ли мы пустой список, и если да, то мы возвращаем пустой список. В противном случае мы берем CDR автомобиля, чтобы получить желаемый город и штат.