Упражнение 4 Иногда мы хотим связать элементы по определенному свойству. Например, скажем, у нас было следующее определение для чашек:
(define-struct cup [oz color material])
; A Cup is a (make-cup NonNegNumber String String)
; and represents a cup's capacity in fluid ounces, color, and material
(define CUP1 (make-cup 10 "brown" "wood"))
(define CUP2 (make-cup 8 "brown" "ceramic"))
(define CUP3 (make-cup 10 "red" "plastic"))
(define CUP4 (make-cup 6 "clear" "plastic"))
(define CUPS
(cons CUP1
(cons CUP2
(cons CUP3
(cons CUP4 empty)))))
Мы могли бы складывать чашки по их вместимости в жидких унциях, в этом случае у нас было бы: 10: CUP1 и CUP3
8: CUP2
6: CUP4
В качестве альтернативы, мы можем поменять чашки по цвету, и в этом случае у нас будет: «коричневый»: CUP1 и CUP2
"red": CUP3
"clear": CUP4
Обратите внимание, что единственная разница в том, что характерно для предметовмы используем для бин - мы будем ссылаться на различные значения этой характеристики как «ключи» биннинга (например, 10, 8, 6 в первом примере). Каждая запись в результате, ячейка, имеет ключ, а также список исходных элементов, имеющих этот ключ (в том порядке, в каком они были в исходном списке).
Разработка функции create-binning, которая принимаетв 3 аргументах - список элементов, экстрактор ключа и отношение эквивалентности ключа - и создает биннинг.
Экстрактор ключа - это функция, которая извлекает информацию из элемента, чтобы определить, к какому бину он должен принадлежать,В первом приведенном примере это была бы функция, которая берет чашку и производит ее емкость.
Отношение эквивалентности - это функция, которая принимает два элемента и выдает логическое значение, указывающее, равны ли они или нет. Во втором примере отношение эквивалентности ключей будет функцией, которая сообщает нам, равны ли два цвета.