langage L'équivalent de Clojure(ou Lisp) d'un test booléen composé



lisp exemple (4)

En C ++, j'écrirais quelque chose comme ceci:

if (a == something && b == anotherthing)
{
   foo();
}

Ai-je raison de penser que l'équivalent de Clojure est quelque chose comme ceci:

(if (= a something)
    (if (= b anotherthing)
        (foo)))

Ou y a-t-il une autre façon d'effectuer un "et" logique que j'ai raté? Comme je l'ai dit la dernière forme semble fonctionner correctement - je me demandais juste s'il existe une façon plus simple d'effectuer la logique et. Et la recherche de "booléen" "logique" et "et" sur le groupe Google Clojure a donné trop de résultats pour être très utile.


Answer #1

C'est vraiment cool! (and xy) est une macro - vous pouvez vérifier le code source sur clojure.org - qui s'étend à (if xy false) équivalent à:

if (x) {
  if (y) {
    ...
  }
} else {
  false
}

(or xy) est similaire mais inversé.


Answer #2

En Common Lisp et Scheme

(and (= a something) (= b another) (foo))

Answer #3

Dans Clojure, j'utiliserais normalement quelque chose comme:

(if 
  (and (= a something) (= b anotherthing))
  (foo))

Il est clairement possible d'être plus concis (par exemple la réponse de Doug) mais je pense que cette approche est plus naturelle pour les gens à lire - surtout si les futurs lecteurs du code ont un arrière-plan C ++ ou Java!


Answer #4

Dans Common Lisp, ce qui suit est aussi un idiome commun:

(when (and (= a something) (= b another))
  (foo))

Comparez cela à la réponse de Doug Currie en utilisant (and ... (foo)) . La sémantique est la même, mais en fonction du type de retour de (foo) , la plupart des programmeurs Common Lisp préféreraient l'un à l'autre:

  • Utilisez (and ... (foo)) dans les cas où (foo) renvoie un booléen.

  • Utilisez (when (and ...) (foo)) dans les cas où (foo) renvoie un résultat arbitraire.

Une exception qui prouve la règle est le code où le programmeur connaît les deux idiomes, mais écrit intentionnellement (and ... (foo)) toute façon. :-)