freeCodeCamp/guide/russian/clojure/more-on-functions/index.md

5.2 KiB
Raw Blame History

title localeTitle
Clojure More on Functions Clojure Больше о функциях

Функция! Они очень важны. Очень сложно делать что-либо без функции. Они являются неотъемлемой частью любого языка, но особенно Clojure, поскольку это функциональный язык программирования, который отвергает объектно-ориентированный дизайн. Давайте узнаем еще о них!

Arity

Arity относится к числу аргументов, которые ожидает ваша функция.

;; add expects 2 arguments. Its arity is 2. 
 (defn add [xy] (+ xy)) 
 (add 2 2) 
 ; => 4 
 
 ;; + itself is a function, and it can have any number of arguments. 
 (+ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16) ;; and so on... 
 ; => 136 

Clojure имеет специальный синтаксис, который позволяет вам делать свою функцию разными вещами в зависимости от количества аргументов, которые она получает. Это называется переменной arity.

(defn foo 
  ([]                               ; if this function gets no arguments... 
    (println "Lisa needs braces!")) ; do this. 
  ([arg1]                           ; if this function gets 1 argument... 
    (println "Dental plan!")))      ; do this instead! 
 (foo) 
 ; => Lisa needs braces! 
 ;    nil 
 (foo "this is a placeholder argument.") 
 ; => Dental plan! 
 ;    nil 

:rocket: IDEOne!

Анонимные функции

Давайте посмотрим на очень простую функцию: функцию, которая добавляет 1 к числу.

;; I've called this function "my-inc" so you don't confuse it with inc. 
 ;; inc is a built-in function that already does this for us. 
 (defn my-inc [n] (+ 1 n)) 
 (inc' 5) 
 ; => 6 

Это выглядит довольно просто. Он принимает один параметр - n - и возвращает n + 1 . Давайте ее разобьем.

(def my-inc-2 (fn [n] (+ 1 n))) 
 (inc' 5) 
 ; => 6 

Вы можете видеть из этого, что использование defn является просто сокращением для использования (def ... (fn ...)) . Но это показывает что-то интересное. То, что мы на самом деле делаем, это не «определение функции», а просто привязка анонимной функции к специальному имени - inc' . Что, если мы не дадим ему имя?

((fn [n] (+ 1 n)) 5) 
 ; => 6 

Бам! Boom! Kapow! Анонимные функции. Теперь это может показаться бесполезным, но в конце концов это очень удобно для применения функций списков с использованием map , reduce и filter . Предоставление каждой функции, которую вы пишете, становится скучным и громоздким, быстрым.

Существует более короткий способ писать анонимные функции, предназначенные для очень коротких и простых функций. Это не позволяет деструктурировать или переменную arity. Однако это довольно кратким.

(#(+ 1 %) 5) 
 ; => 6 

#(...) - сокращенный способ определения анонимной функции. % относится к первому аргументу функции. Если ваша функция ожидает несколько аргументов, вы можете использовать %1, %2, ... %n .

(#(str %1 %2 %3) "foo" "bar" "baz") 
 ; => "foobarbaz" 

:rocket: IDEOne!

| :point_left: Предыдущая | :book: Главная :book: | следующий :point_right: |
| Loop и Recur | Содержание | Коллекции |