Pourquoi la deuxième opération donne-t-elle la valeur false? L'argument "ou" fonctionne-t-il différemment dans clojure? Si tel est le cas, comment dois-je écrire l'opération pour qu'elle devienne true, quel que soit l'endroit où se trouve le 0 dans l'argument?

(= (or 0 1) 0) ; true

(= (or 1 0) 0) ; false
4
Zalán Józsa 27 déc. 2015 à 09:38

5 réponses

Meilleure réponse

or n'est pas une fonction - c'est une macro. il se développe en if appels et par là les règles de if vérité s'appliquent: nil ou false sont flasey, tout le reste est vrai - y compris 0.

user=> (when 0 (println "true"))
true
nil

Votre code se développe pour:

user=> (macroexpand '(or 1 0))
(let* [or__4238__auto__ 1] (if or__4238__auto__ or__4238__auto__ (clojure.core/or 0)))

Donc, en bref, le code généré par or renvoie le premier argument de vérité - ou le dernier.

Donc, si vous voulez savoir, si votre liste contient zéro, utilisez quelque chose de plus approprié:

user=> (some zero? [1 2 3])
nil
user=> (some zero? [1 2 0])
true

Ou dans le cas où 0 il y a aussi un paramètre:

user=> (some #{0} [1 2 3])
nil
user=> (some #{0} [1 2 0])
0
3
cfrick 27 déc. 2015 à 13:42

(or)(or x)(or x & next) - évalue les expressions une à la fois, de gauche à droite .

Si le formulaire renvoie une valeur logique vraie , or renvoie cette valeur et n'évalue aucune des autres expressions, sinon il renvoie le valeur de la dernière expression ou nil si la dernière expression est falsy (Source: documentation Clojure).

Dans la première instruction (= (or 0 1) 0) le (ou 0 1) retourne 0 car c'est logique true (en clojure inly nil et false sont faux) puis comparez avec 0 donc le résultat est true.

Dans la deuxième instruction (= (or 1 0) 0), il renvoie 1 et le compare à 0 et renvoie false car ils ne sont pas égaux.

5
Andriy Ivaneyko 27 janv. 2016 à 09:22

Ou renvoie la première valeur non fausse ou fausse. Donc dans vos exemples ou renverra le premier nombre de la liste d'arguments, zéro ou autre.

3
sampwing 27 déc. 2015 à 07:25

Dans Clojure nil et false sont faux, tout le reste est vrai.

Si vous voulez que le résultat de l'expression soit vrai lorsqu'il y a un zéro dans une liste, vous devez tester si certains éléments de la liste sont égaux à zéro. (some zero? [0 1])

3
kawas44 27 déc. 2015 à 14:15

Vous testez l'égalité des valeurs logiques. C'est une odeur de code dans la plupart des langues et pire dans Clojure.

(or 0 1) ; 0
(or 1 0) ; 1

... puisque 0 et 1 sont logiquement vrais, et or renvoie son premier argument logiquement vrai (ou le dernier argument, s'il n'y en a pas). Les seules choses qui ne sont pas vraies sont nil et false (et sa forme encadrée Boolean/FALSE).

Le fait que or soit une macro est accessoire dans ce cas.

2
Thumbnail 27 déc. 2015 à 16:24