Szukaj…


Definiowanie funkcji

Funkcje są zdefiniowane za pomocą pięciu komponentów:

Nagłówek zawierający słowo kluczowe defn , nazwa funkcji.

(defn welcome ....)

Opcjonalny Docstring, który wyjaśnia i dokumentuje działanie tej funkcji.

(defn welcome 
    "Return a welcome message to the world"
     ...)

Parametry wymienione w nawiasach.

(defn welcome 
    "Return a welcome message"
    [name]
    ...)

Ciało, które opisuje procedury, które wykonuje funkcja.

(defn welcome 
    "Return a welcome message"
    [name]
    (str "Hello, " name "!"))

Nazywając to:

=> (welcome "World")

"Hello, World!"

Parametry i arity

Funkcje Clojure można zdefiniować z zerowymi lub więcej parametrami.

(defn welcome
    "Without parameters"
    []
    "Hello!")

(defn square
    "Take one parameter"
    [x]
    (* x x))

(defn multiplier
    "Two parameters"
    [x y]
    (* x y))

Arity

Liczba argumentów pobieranych przez funkcję. Funkcje obsługują przeciążanie arity , co oznacza, że funkcje w Clojure pozwalają na więcej niż jeden „zestaw” argumentów.

(defn sum-args
  ;; 3 arguments
  ([x y z]
     (+ x y z))
  ;; 2 arguments
  ([x y]
     (+ x y))
  ;; 1 argument 
  ([x]
     (+ x 1)))

Arities nie muszą wykonywać tej samej pracy, każda ariana może zrobić coś niezwiązanego:

(defn do-something
  ;; 2 arguments
  ([first second]
     (str first " " second))
  ;; 1 argument 
  ([x]
     (* x x x)))

Definiowanie funkcji wariadycznych

Funkcję Clojure można zdefiniować tak, aby pobierała dowolną liczbę argumentów, używając symbolu & na liście argumentów. Wszystkie pozostałe argumenty są gromadzone jako sekwencja.

(defn sum [& args]
  (apply + args))

(defn sum-and-multiply [x & args]
  (* x (apply + args)))

Powołanie:

=> (sum 1 11 23 42)
77

=> (sum-and-multiply 2 1 2 3)  ;; 2*(1+2+3)
12

Definiowanie anonimowych funkcji

Istnieją dwa sposoby zdefiniowania funkcji anonimowej: pełna składnia i skrót.

Pełna anonimowa składnia funkcji

(fn [x y] (+ x y))

To wyrażenie zwraca wartość funkcji. Dowolną składnię, której możesz użyć z funkcją zdefiniowaną za pomocą defn ( & , defn argumentów itp.), Możesz również zrobić z formularzem fn . defn to tak naprawdę makro, które właśnie robi (def (fn ...)) .

Skrócona składnia anonimowej funkcji

#(+ %1 %2)

To jest skrótowy zapis. Używając notacji skrótowej, nie musisz jednoznacznie nazywać argumentów; zostaną im przypisane nazwy %1 , %2 , %3 itd. zgodnie z kolejnością, w jakiej zostały przekazane. Jeśli funkcja ma tylko jeden argument, jego argument nazywa się po prostu % .

Kiedy używać każdego z nich

Notacja skrótowa ma pewne ograniczenia. Nie można zniszczyć argumentu i nie można zagnieździć stenograficznych funkcji anonimowych. Poniższy kod zgłasza błąd:

(def f #(map #(+ %1 2) %1))

Obsługiwana składnia

Można używać skróconych varargs z funkcji anonimowych. Jest to całkowicie legalne:

#(every? even? %&)

Pobiera zmienną liczbę argumentów i zwraca wartość true, jeśli każdy z nich jest parzysty:

(#(every? even? %&) 2 4 6 8)
;; true
(#(every? even? %&) 1 2 4 6)
;; false

Pomimo pozornej sprzeczności możliwe jest napisanie nazwanej funkcji anonimowej poprzez dołączenie nazwy, jak w poniższym przykładzie. Jest to szczególnie przydatne, gdy funkcja musi się wywoływać, ale także w śladach stosu.

(fn addition [& addends] (apply + addends))


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow