IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langages fonctionnels Discussion :

[Clojure] Question sur code tuto


Sujet :

Langages fonctionnels

  1. #1
    Membre chevronné

    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    février 2004
    Messages
    757
    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 : 757
    Points : 2 046
    Points
    2 046
    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
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : mai 2013
    Messages : 151
    Points : 274
    Points
    274
    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
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 190
    Points : 182
    Points
    182
    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 : 113
    Points
    113
    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 Langage
    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