comparer une variable avec une chaine de caractères
Le
TeXnicien de surface
bonjour à tou(te)s
voici le début d'une petite fonction que je tente de mettre au point :
(defun lille-simplement-choisir ()
(interactive "sChoix (Oui/Non) : ")
(if ((equal Choix "Oui"))
(progn
(kill-line nil))
)
)
J'ai une erreur comme doivent s'en apercevoir ceux qui savent :)
au niveau du test.
Comment faire pour comparer la variable Choix avec le texte "oui" ?
Merci de tout début de commencement de réponse.
--
Le TeXnicien de surface
voici le début d'une petite fonction que je tente de mettre au point :
(defun lille-simplement-choisir ()
(interactive "sChoix (Oui/Non) : ")
(if ((equal Choix "Oui"))
(progn
(kill-line nil))
)
)
J'ai une erreur comme doivent s'en apercevoir ceux qui savent :)
au niveau du test.
Comment faire pour comparer la variable Choix avec le texte "oui" ?
Merci de tout début de commencement de réponse.
--
Le TeXnicien de surface

Poser une question


1- les parenthèses fermantes s'écrivent sur la même ligne.
2- laisser emacs effectuer l'indentation (utiliser C-M- ou M-q)
3- encore mieux, utiliser paredit pour éditer du code lisp, ça facilite
la vie. http://www.emacswiki.org/emacs/ParEdit
Donc, partons du code correctement formaté:
(defun lille-simplement-choisir ()
(interactive "sChoix (Oui/Non) : ")
(if ((equal Choix "Oui"))
(progn
(kill-line nil))))
La règle de lisp est trop simple. Beaucoup de gens ne peuvent pas
comprendre une règle si simple.
Pour évaluer une expression:
- si c'est un symbole, on retourne la valeur de la variable dénotée
par ce symbol.
- si c'est un autre atome, on le retourne tel quel.
- sinon c'est une liste. On regarde alors le premier élément de la
liste:
- si c'est un symbole qui dénote un opérateur spécial on
applique la règle spécifique à cet opérateur spécial (par
exemple, if).
- si c'est un symbole qui dénote une macro, on appèle la macro
fonction pour étendre l'expression, et on évalue le
résultat.
- si c'est un symbole qui dénote une fonction, ou une lambda
liste [du genre (lambda (parametres...) expressions...)],
alors:
- on évalue les arguments qui sont dans le reste de la
liste,
- on appelle la fonction avec comme paramètres les
résultats des évaluations des arguments.
Et c'est tout.
Comme dans la liste:
((equal Choix "Oui"))
le premier élément est:
(equal Choix "Oui")
qui n'est ni un symbole, ni une lambda liste, ça ne veut rien dire.
(defun lille-simplement-choisir (choix)
(interactive "sChoix (Oui/Non) : ")
(if (equal choix "Oui")
(kill-line)))
J'utiliserais plutôt string-equal:
(defun lille-simplement-choisir (choix)
(interactive "sChoix (Oui/Non) : ")
(cond
((string-equal choix "oui")
(kill-line))
((string-equal choix "non")
(message "Annulé"))
(t
(error "Choix invalide"))))
--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
A mon avis, il faut comparer
((equal Choix "Oui"))
(list (equal Choix "Oui"))
et laisser l'esprit de l'interlocuteur travailler
par différentiation. Mais cela n'empêchera pas
que les parenthèses sont un constructeur en lisp
et que trop parenthéser n'est ici pas une sécurité :
c'est un crime ! :)
A.O.
TeXnicien de surface
Il ne faut pas le faire ! Rien de plus perturbant qu'un système qui vous
pose des questions où il faut choisir parfois entre Oui et Non et
parfois entre Yes et No !
Donc la "bonne" méthode est :
(if (yes-or-no-p "Voulez-vous XXX ? ")
(XXX))
Ce qui permet en sus d'utiliser une fenêtre de dialogue si on aime ça...
--
Paul Gaborit -
Sinon ton problème c'est qu'il faut que Choix soit argument de la
fonction, il aurait fallu écrire:
(defun lille-simplement-choisir (choix)
(interactive "sChoix (Oui/Non) : ")
(if ((string= choix "Oui"))
(progn
(kill-line nil))
)
)
Mais sinon en effet on utilise en general yes-or-no-p ou y-or-n-p pour
ce genre de chose.
Sinon tu peux aussi utiliser la fonction read-from-minibuffer, ça permet
notamment d'avoir un historique séparé, et de restreindre le choix à une
liste finie de valeur si on le désire.
Vincent.
À noter aussi, autant utiliser string= que equal, mais bon le pb n'est
pas là.
Vincent.