Распределение предикатов - это способ предоставления различных ответов на вызов функции в зависимости от числа, «формы» и значений аргументов функции. Функции Clojure уже отправляются в разные части кода, в зависимости от количества аргументов, переданных функции:
(defn my-func
([a] (* a a))
([a b] (* a b)))
Мультиметоды Clojure добавляют к этому возможность отправки в разные методы - возможно, определенные в разных пространствах имен - на основе возвращаемого значения функции диспетчеризации, которая проверяет аргументы (которые могут включать их число, класс и значение) и определяет, какие метод для всех. Как отмечено в сносках к ответу Стюарта Сьерры, создатель мультиметода получает возможность определить функцию диспетчеризации, и ее обычно нельзя изменить. Кроме того, программист должен вручную разработать сверхсложную диспетчерскую функцию для функции, которая выполняет одно для целого числа со значением 0, а другое - для положительного целого числа; или одна вещь для списка из одного или нескольких элементов, а другая для пустого списка.
Диспетчеризация предиката (возможно) предоставит синтаксис, который сам генерирует эту сложную диспетчерскую функцию Например, факториальная функция может быть определена таким образом
(defmatch fact [0] 1)
(defmatch fact [n] (* n (fact (dec n))))
Прежний код отвечает на вызов
(fact 0)
последний код для вызова с одним аргументом любого другого значения. Это (негласно) определит мультиметод с функцией диспетчеризации, которая отличает ноль от других значений.
Но позже я мог бы указать, что я хочу факториал для карты (возможно), кодируя
(defmatch fact [x {}] (fact (:value x)))
и код может (теоретически) перехватывать вызовы, передавая карту факту, делегируя другие вызовы исходной функции диспетчеризации ... все за кадром.