Clojure:
Организация кода в функции
Как это делать:
Функции в Clojure определяются с помощью defn
, после чего следует имя, параметры и тело функции. Вот быстрый пример.
(defn greet [name]
(str "Привет, " name "!"))
(greet "Алекс") ; => "Привет, Алекс!"
Допустим, теперь мы хотим вычислить площадь прямоугольника. Вместо того чтобы смешивать все вместе, мы разделим это на две функции:
(defn area [length width]
(* length width))
(defn print-area [length width]
(println "Площадь равна:" (area length width)))
(print-area 3 4) ; => Площадь равна: 12
Глубокое погружение
Когда-то давно программисты просто вставляли всю свою логику в один большой блок. Это было уродливо. Затем пришло структурное программирование, и функции стали чем-то обыденным. В Clojure каждая функция является объектом первого класса — вы можете манипулировать ими как любым другим значением.
Альтернативы? Некоторые могут возиться с мультиметодами или функциями высшего порядка, но это всего лишь приправы в бульоне функций.
Все в деталях функции: в Clojure они неизменяемы, что делает путаницу с побочными эффектами менее вероятной. Они сильно опираются на рекурсию вместо типичных циклов, что хорошо сочетается с функциональными парадигмами языка.
Смотрите также
- Собственное руководство Clojure: https://clojure.org/guides/learn/functions
- Основы функционального программирования: https://www.braveclojure.com/core-functions-in-depth/
- Выступления Рича Хики: https://changelog.com/posts/rich-hickeys-greatest-hits - для понимания философии Clojure.