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 :

[CLisp] - Fonction Position


Sujet :

Lisp

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Par défaut [CLisp] - Fonction Position
    Bonjour, je voudrais faire une fonction comme la fonction prédéfinie position.
    J'ai fais une fonction itérative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (defun position (x lst)
      (when (consp lst)
        (loop for c in lst for i from 0
          when (equal c x) return i)))
    Maintenant j'essaye de refaire cette fonction de façon a ce qu'elle soit récursive, mais je ne vois pas trop comment.

  2. #2
    Membre averti
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Par défaut
    J'ai tenté avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun position (x lst)
      (cond
        ((atom lst) nil)
        ((equal (car lst) x) 0)
        ((null (car lst)) (posi x))
        (t (1+ (posi x (cdr lst)))) ) )
    Elle fonctionne tant que la fonction ne tombe pas sur un nil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (posit 'd '(a b c d e f)
    3
    (posi 'y '(a b c d e f)
    nil is not a number
    Sauf que je ne peux pas changer le nil de (atom list) sinon le nil est compter.

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    D'abord, dans ta fonction position il est fait appel à la fonction "posi": est-ce volontaire, une erreur de frappe?

    Ensuite, il faut que tu partes de la spécification de la fonction: qu'est ce que ta fonction est censée faire si on lui fournit des arguments corrects, et que doit elle faire si on lui fournit des arguments incorrects?

    Pour la première partie, quand les arguments sont corrects, la fonction doit retourner nil si l'élément n'est pas présent, et l'index de l'élément s'il est présent. L'élément est absent si on est arrivé à la fin de la liste, c'est-à-dire que la liste est vide = Nil

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun pos (x lst)
      (cond
        ((null lst) nil) ;; on est arrivé à la fin de la liste
        ((equal (car lst) x) 0) ;; on est arrivé à l'élément recherché
        (T (1+ (pos x (cdr lst)))))) ;; sinon on va un élément plus loin
    Pour la gestion d'erreur, à toi de jouer.

  4. #4
    Membre averti
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Par défaut
    Bonjour et merci pour la réponse

    En effet pour posi et position, c'est des erreurs de frappes j’étais sur mon téléphone

    Ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun position (x lst)
      (cond
        ((atom lst) nil)
        ((equal (car lst) x) 0)
        ((null (car lst)) (posi x))
        (t (1+ (position x (cdr lst)))) ) )
    et ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun pos (x lst)
      (cond
        ((null lst) nil)
        ((equal (car lst) x) 0)
        (T (1+ (pos x (cdr lst))))))
    fonctionnent toutes les deux et donnent le même résultat sauf pour les erreurs comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (pos 'x '(c d e f a b))
    - 1+: NIL is not a number
    Moi je cherche a savoir comment faire pour éviter cette erreur :/

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Exact!

    Il faut modifier la fonction de la façon suivante, pour éviter (1+ Nil):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun pos (x lst)
      (cond
        ((null lst) nil)
        ((equal (car lst) x) 0)
        (T (let ((nxt (pos x (cdr lst))))
              (when nxt (1+ nxt)))))

  6. #6
    Membre averti
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Par défaut
    Merci stendhal666 !

Discussions similaires

  1. fonction position dans Essbase
    Par dadou2555 dans le forum EPM (Hyperion)
    Réponses: 0
    Dernier message: 15/09/2013, 17h02
  2. [XSLT 1.0] XSLT: utilisation de la fonction position() dans <for-each> imbriqués
    Par bernidupont dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/05/2011, 21h33
  3. [VBA]connaitre valeur en fonction position souris
    Par cbleas dans le forum VBA Access
    Réponses: 6
    Dernier message: 23/04/2007, 19h35
  4. [XSLT] fonction position()
    Par Raumfahrerralf dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/03/2007, 18h01
  5. [XSLT] [PHP 5] fonction position()
    Par sharper dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 01/12/2005, 12h58

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