#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
к их соответствующим значениям в этом отображении.