Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comparer une variable avec une chaine de caractères

7 réponses
Avatar
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

7 réponses

Avatar
Pascal J. Bourguignon
TeXnicien de surface writes:

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))
)
)



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))))

J'ai une erreur --- comme doivent s'en apercevoir ceux qui savent :) ---
au niveau du test.



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.



Comment faire pour comparer la variable Choix avec le texte "oui" ?



(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"))))



Merci de tout début de commencement de réponse.



--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Avatar
Olve
[...]
La règle de lisp est trop simple. Beaucoup de gens ne peuvent pas
comprendre une règle si simple.



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.
Avatar
Paul Gaborit
À (at) Sun, 09 Oct 2011 12:16:59 +0200,
TeXnicien de surface écrivait (wrote):

Comment faire pour comparer la variable Choix avec le texte "oui" ?



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 - <http://perso.mines-albi.fr/~gaborit/>
Avatar
vincent.belaiche
TeXnicien de surface writes:

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.



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.
Avatar
vincent.belaiche
TeXnicien de surface writes:

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.



À noter aussi, autant utiliser string= que equal, mais bon le pb n'est
pas là.

Vincent.
Avatar
Olve
[...]

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"))



Oups, on a laissé passer cela, ouille, ouille, ouille !!!
Bon, je vais me cacher sous l'escalier (pour éviter
l'évaluation :p) --
A.O.
Avatar
TeXnicien de surface
Le 09/10/2011 22:20, Vincent Belaïche a écrit :
TeXnicien de surface writes:

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.



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.



Merci pour les réponses. J'ai fini en effet par m'apercevoir du coup de
l'argument de la fonction. Bref beaucoup d'erreurs sur un tout petit
bout de code.
Enfin, c'est pas pour dire mais j'ai fini par renoncer au choix et je me
suis fait deux fonctions, donc deux raccourcis clavier ce qui, en
l'espèce, résout mieux mon problème. Comme quoi, quitte à réfléchir,
mieux vaut le faire complètement.

En espérant ne pas avoir oublié tout ça la prochaine fois que je devrais
me replonger dans du lisp. On a beau dire, avec l'age, les neurones
c'est plus c'que c'était mon bon monsieur.


--
Le TeXnicien de surface