Aller au contenu

Fonction (or [expr...])


Messages recommandés

Posté(e)

Bonjour,

 

quelqu'un saurait il m'expliquer la logique de la fonction OR SVP, je n'arrive pas à l'exploiter.

 

Exemple de l'aide:

 Command: (or nil 45 '())
T

Command: (or nil '())
nil

 

Je n'ai pas trouvé ces exemples très parlant.

A quoi servent les parenthèses de la fin, pourquoi (or nil..)

Posté(e)

Salut

 

La fonction or retourne le résultat (T ou nil) d'un OU logique sur les expressions qui lui sont passés en arguments.

 

Contrairement à d'autres langages plus fortement typés LISP, ces expressions ne doivent pas nécessairement avoir un type Booléen Vrai ou Faux (T ou nil), mais plus généralement toute expression évaluée comme n'étant pas nil est considérée comme vraie, ceci s'applique à tous les prédicats utilisés en LISP (avec les fonctions and, if, cond, ...).

 

or évalue tour à tour les expressions qui lui sont passées comme arguments dans l'ordre dans lequel elles sont passées et arrête l'évaluation et retourne T dès que le résultat d'une expression n'est pas nil.

or retourne nil si toutes les expressions sont nil.

 

(or nil 45 '())

or évalue le premier argument : nil, qui donne nil.

or passe au second argiment : 45, qui donne 45 (résultat non nil)

L'évaluation s'arrête et la fonction retourne T.

 

(or nil '())

or évalue le premier argument : nil, qui donne nil.

or évalue le second argument : '() une liste vide, ce qui donne nil.

Il n'y a plus d'arguments la fonction retourne nil.

 

and fonctionne de manière similaire et retourne nil dès qu'un argument est évalué à nil, ou T si aucun des argument n'est évalué à nil.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut,

 

Merci pour ces explications.

Mais comment se servir de cette fonction concrètement?

 

Pour moi, une fonction OU ce serait par exemple

 (defun c:jeu (/)
 (setq toto (getreal "entrez un nb: "))
 (if (= TOTO (or 2 5))
   (prompt "gagné")
   (prompt "perdu")
 )
 (princ)
)

 

Sauf que dans cet exemple c'est toujours perdu qui m'est renvoyé...

Posté(e)

Examinons l'expression conditionnelle passée comme premier argument à (if ...) :

(= TOTO (or 2 5))

 

Il s'agit d'un appel de la fonction = à laquelle sont passées deux expressions comme argument.

Ces arguments doivent être évalués, c'est à dire réduits à des valeurs (ou expressions auto-évaluantes) avant d'évaluer le résultat de l'expression (= ...) qui sera lui même utilisé par (if ...).

 

Le premier argument est la variable toto qui est le résultat de l'expression (setq toto (getreal ...)) sa valeur sera donc un nombre (ou nil si l'utilisateur a fait "Enter").

Le second argument sera le résultat de l'expression (or 2 5). Comme dit plus haut au premier argument non nil, la fonction or arrête l'évaluation et retourne T. Ici le premier argument est 2 (qui n'est jamais nil), l'expression retournera donc toujours T.

 

On en revient donc à évaluer (= toto T) où toto ne peut être qu'un nombre ou nil mais jamais T. Cette expression retournera donc toujours nil ("perdu").

 

Ce que tu semble chercher à évaluer c'est si toto égal 2 ou si toto égal 5 alors "gagné", sinon "perdu".

 

en LISP on l'écrit :

(if (or (= toto 2) (= toto 5))
 (prompt "gagné")
 (prompt "perdu")
)

 

L'expression conditionnelle est cette fois un appel de la fonction or :

(or (= toto 2) (= toto 5))

les arguments passé à or sont les expressions (= toto 2) et (= toto 5) qui seront évaluées avant l'évaluation de (or ...) et ne pourront avoir que les formes suivantes :

(or T nil) si toto = 2 => l'expression retourne T => ("gagné")

(or nil T) si toto = 5 => l'expression retourne T => ("gagné")

(or nil nil) si toto est différent de 2 et 5 => l'expression retourne nil => ("perdu")

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité