Bortch59 Posté(e) le 5 juin 2011 Posté(e) le 5 juin 2011 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..)
(gile) Posté(e) le 5 juin 2011 Posté(e) le 5 juin 2011 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
Bortch59 Posté(e) le 5 juin 2011 Auteur Posté(e) le 5 juin 2011 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é...
(gile) Posté(e) le 5 juin 2011 Posté(e) le 5 juin 2011 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
Bortch59 Posté(e) le 8 juin 2011 Auteur Posté(e) le 8 juin 2011 Salut, merci pour cette petite leçon.Effectivement j'avais oublié que tout doit être évalué... [Edité le 8/6/2011 par Bortch59]
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant