Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre éprouvé

    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    février 2004
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : février 2004
    Messages : 625
    Points : 1 296
    Points
    1 296

    Par défaut [Clojure] Question sur code tuto

    Bonjour, j'essaye de suivre un tutorial Clojure, et il y a un exemple que j'ai du mal à saisir (source).

    Le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ;; inc-by is in scope, so the returned function has access to it even
    ;; when the returned function is used outside inc-maker
    (defn inc-maker
      "Create a custom incrementor"
      [inc-by]
      #(+ % inc-by))
    
    (def inc3 (inc-maker 3))
    
    (inc3 7) ; => 10
    Le sujet est les fonctions retournants des fonctions. Je ne comprends pas pourquoi le % retourne 7 dans la fonction inc-maker, dans l'exemple utilisé.

    Tel que je le vois actuellement :

    1) La fonction in3 et exécutée avec en paramètre (inc-maker 3)
    2) La liste [inc-by] est le paramètre 3?
    3) D'où sort le %=7 dans la fonction anonyme # ??

    Merci de vos lumières.

    P.S. je ne savais pas où mettre ma question, dans Lisp ou non...

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    mai 2013
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : mai 2013
    Messages : 144
    Points : 261
    Points
    261

    Par défaut

    Tout d'abord, je ne sais pas Clojure.

    A ce qui paraît, % est l'argument d'une fonction anonyme.

    Alors, pour un inc-by donné, inc-maker retourne une fonction qui ajoute inc-by à son argument. Ainsi, (inc-maker 3) retourne la fonction qui ajoute 3 a son argument. On nomme cette fonction inc3. Ensuite, on applique la fonction à 7. Elle ajoute 3 à 7 et on obtient 10.

    Ainsi, inc3 équivaut a #(+ % inc-by), ou inc-by se souvient de la valeur 3 que il avait dans l'évocation (inc-maker 3), ce qui s'appelle la « closure ». En évoquant inc3, on remplace % pour 7.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    octobre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 183
    Points : 180
    Points
    180

    Par défaut

    pour apprendre, j'ai commencé avec cette vidéo en anglais, mais cela m'a permis de mieux comprendre le langage,

    la raison est que j'utilise Kafka et storm du monde hadoop (bigdata)

    storm utlise clojure pour paralléliser le traitement des messages de twiter. en comparaison cela se rapproche un peu de camel.

    vers la fin de la video ils parlent de counter


  4. #4
    Membre régulier
    Inscrit en
    septembre 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 78
    Points : 109
    Points
    109

    Par défaut

    Salut !

    Désolé pour la réponse tardive, mais je me dis que mieux vaut tard que jamais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (defn inc-maker
      "Create a custom incrementor"
      [inc-by]
      #(+ % inc-by))
    #() permet de créer une fonction anonyme, si tu veux utiliser un argument dans ta fonction anonyme, tu mets un %, si tu en as plusieurs: %1 %2 ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (def inc3 (inc-maker 3))
    Ici tu définis une fonction mais sans utiliser le raccourci proposé par la macro defn, quand tu appelles (inc-maker 3), la fonction te renvoie la fonction suivante: #(+ % 3)
    Vu que tu appelles inc-maker avec l'argument 3, il remplace inc-by par 3, mais le % n'est pas encore pourvu.

    Donc en appellant (inc3 7), le 7 remplace le % dans (+ % 3) et donc tu as (+ 7 3 ) ;=> 10

Discussions similaires

  1. [MCD] Question sur un tuto
    Par naunau31 dans le forum Schéma
    Réponses: 7
    Dernier message: 04/02/2009, 16h52
  2. Questions sur le tuto de Yogui sur PHP5
    Par Dendrite dans le forum Débuter
    Réponses: 1
    Dernier message: 01/09/2008, 10h19
  3. question sur Code::blocks
    Par deubelte dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 04/01/2007, 15h44
  4. À lire avant de poster vos questions sur Code::Blocks
    Par khayyam90 dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 12/07/2006, 08h23
  5. [AJAX] Question sur un tutos ajax
    Par maximenet dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/03/2006, 21h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo