Функции с именованными параметрами в Clojure

#functional-programming #clojure

#функциональное программирование #clojure

Вопрос:

В этом коде обсуждаются именованные аргументы в Clojure из «The Joy of Clojure»:

 (defn slope [amp; {:keys [p1 p2] :or {p1 [0 0] p2 [1 1]}}] 
   (float (/ (- (p2 1) (p1 1))
             (- (p2 0) (p1 0)))))

(slope :p1 [4 15] :p2 [3 21])
  

Саму функцию я понимаю — никаких проблем с деструктурированием — но я не понимаю вызова.
Передаем ли мы четыре аргумента в slope? как назначаются векторы: p1 и : p2?

Ответ №1:

Вы передаете четыре аргумента в slope, да. [] Часть slope определяет параметры, в которой amp; означает «ввести все дополнительные параметры в эту форму», которая затем указывает, что она ищет аргументы, которые формируют сопоставление с ключами p1 и p2 (и выдает значения по умолчанию, если ни один из них не существует).

Комментарии:

1. Я понял это, но при вызове: (наклон: p1 [4 15]: p2 [3 21]) как p1 получает значение [4 15] и p2 [3 21]?

2. p1 получено значение, [4 15] потому что аргументы :p1 [4 15] :p2 [3 21] обрабатываются как отображение, а в блоке параметров в slope указано привязать переменные p1 и p2 к их соответствующим значениям в этом отображении.