Définir une fonction

defn

Une fonction peut se définir de plusieurs façons.

La façon la plus classique est d'utiliser defn. Il est possible (ainsi que sur def d'ailleurs) d'ajouter une docstring, c'est à dire une description de la fonction.
Les arguments de la fonction sont représentés par un vector.

(defn add-five
  "Add 5 to the number `n`"
  [n]
  (+ 5 n))

(add-five 5)

La fonction précédente est nommée add-five, prend un paramètre nommé n, et ajoute à ce paramètre 5 et retourne le résultat.Par exemple, (add-five 5) donnera 10.

Il n'y a pas de mot clé return en Clojure. La valeur retournée sera la dernière form de la fonction.

def et fn

(def multiply)
  "multiply the 2 parameters"
  (fn [n m]
    (+ n m)                                 ;; do nothing
    (str "Hello " "world" "!")              ;; do nothing
    (println "Side effects")                ;; i/o
    (* m n))                               ;;returned value

La fonction multiply est elle définie en utilisant les mots clés def (que nous avons vu précédemment) et fn. Cette syntaxe est équivalente à defn. On assigne avec def à la variable multiply une fonction définie avec fn.

On remarque également dans cette fonction que c'est bien la dernière form qui est retournée par la fonction.

#(...)

Il est aussi possible de définir des fonctions avec la syntaxe #(...). Le % sera le paramètre de la fonction, et si la fonction possède plusieurs paramètres, on utilise %1, %2, %3... pour les représenter.

(def add #(+ %1 %2))
(add 10 5)

Ce code définit une fonction nommée add, prenant deux paramètres et les additionnant.

Précédent - Suivant -

(defn add-five
  "Add 5 to the number `n`"
  [n]
  (+ 5 n))

(println (add-five 5))
(println (add-five 10.5) "\n")

(def multiply
  "multiply the 2 parameters"
  (fn [n m]
    (+ n m)                                 ;; do nothing
    (str "Hello " "world" "!")              ;; do nothing
    (println "Side effects")                ;; i/o
    (* m n)))                               ;;returned value

(println (multiply 2 4) "\n")

;; you can define functions using #(...)
(def add-three #(+ % 3))
(println (add-three 10) "\n")

(def add #(+ %1 %2))
(println (add 10 5))

Powered by mcorbin - Available on Github