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

Lisp Discussion :

comment lier les éléments d'une liste à des fonctions ?


Sujet :

Lisp

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 160
    Points
    160
    Par défaut comment lier les éléments d'une liste à des fonctions ?
    Bonjour,
    Voilà mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    (defun trois-fn (u v w) (list 
    			   #'(lambda (y) (+ (* u y) 4)) 
    			   #'(lambda (y) (- (* v y) 4 ))
    			  (function (lambda (y) (* w y)))
    			  )
      ) 
    (setf fns (trois-fn 3 -3 1))
     
    (setf f0 (nth 0 fns))
    (setf f1 (nth 1 fns))
    (setf f2 (nth 2 fns))
    (print (funcall f0 10))
    (print (funcall f1 10))
    (print (funcall f2 10))
    Il donne ce que je veux :
    Il calcule la valeur pour y=10 de trois fonctions affines.
    (j'ai utilisé #' et (function ...) pour me rappeler l'équivalence ....)

    Mais je voudrais faire l'affichage avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     (dolist (f '(f0 f1 f2))(funcall f 10))
    (j'ai pas mis le print)
    Comme je m'en doutais cela ne marche pas ;-) comment peut-on lier les fonctions f0, f1, f2 avec les symboles 'f0, 'f1, 'f2 de la liste ?

    Merci d'avance pour une indication.

    rutabagas.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    En prenant note que je n'ai jamais vraiment étudié le CL particulièrement, je tiens à signaler que je n'ai jamais compris l'intérêt d'utiliser function ou #' surtout qu'il est clairement indiqué dans la doc que
    (lambda lambda-list [[declaration* | documentation]] form*)
    == (function (lambda lambda-list [[declaration* | documentation]] form*))
    == #'(lambda lambda-list [[declaration* | documentation]] form*)
    http://www.lispworks.com/documentati...y/m_lambda.htm

    ---

    Ceci dit, ton problème est en fait très simple.
    Bon d'une part tu as oublié que dolist ne renvoi pas chaque élément. Il faudra donc que tu fournisses un effet de bord (affichage avec print par exemple). Ensuite, quand tu utilises l'apostrophe pour créer une liste, les éléments fournis entre parenthèses ne sont pas interprétés. Tu as donc créé la liste des symboles f0 f1 et f2. Hors tu voulais créer la liste des fonctions représentées par f0 f1 et f2 — ce qu'indique d'ailleurs ton titre justement. C'est donc la primitive list que tu dois utiliser et non l'apostrophe.

    'oilà

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 160
    Points
    160
    Par défaut [resolu]
    Citation Envoyé par Garulfo Voir le message
    En prenant note que je n'ai jamais vraiment étudié le CL particulièrement, je tiens à signaler que je n'ai jamais compris l'intérêt d'utiliser function ou #' surtout qu'il est clairement indiqué dans la doc que

    http://www.lispworks.com/documentati...y/m_lambda.htm

    ---

    Ceci dit, ton problème est en fait très simple.
    Bon d'une part tu as oublié que dolist ne renvoi pas chaque élément. Il faudra donc que tu fournisses un effet de bord (affichage avec print par exemple). Ensuite, quand tu utilises l'apostrophe pour créer une liste, les éléments fournis entre parenthèses ne sont pas interprétés. Tu as donc créé la liste des symboles f0 f1 et f2. Hors tu voulais créer la liste des fonctions représentées par f0 f1 et f2 — ce qu'indique d'ailleurs ton titre justement. C'est donc la primitive list que tu dois utiliser et non l'apostrophe.

    'oilà
    MERCI !
    Je viens de comprendre la différence entre (list .....) et '(........) ;-)
    Si ce n'est pas trop abuser j'aimerais que mon programme dessine les fonctions est-ce que tu connais des liens sympas qui traitent du sujet ?

    (suis amateur autodidacte et je rame un peu ... comme tu peux le voir ...)

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par rutabagas Voir le message
    Si ce n'est pas trop abuser j'aimerais que mon programme dessine les fonctions
    C'est-à-dire ? ouvrir une fenêtre graphique et dessiner une « courbe » approximatif ? C'est plus compliqué que ça ne parait de faire une belle courbe.

    Sinon je ne connais pas bien les primitives de dessin en Lisp.

Discussions similaires

  1. [Débutant] Comment sélectionner les éléments d'une liste ?
    Par kheironn dans le forum Entity Framework
    Réponses: 2
    Dernier message: 17/05/2013, 11h36
  2. Réponses: 3
    Dernier message: 03/11/2011, 11h04
  3. Réponses: 15
    Dernier message: 21/05/2010, 00h36
  4. Tri aléatoire parmis les éléments d'une liste
    Par ahouba dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 18h03
  5. Réponses: 3
    Dernier message: 15/05/2006, 16h09

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