Frage

In C ++ würde ich so etwas schreiben:

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

Ist ich richtig, wenn ich denke, dass das Clojure -Äquivalent so etwas ist:

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

Oder gibt es eine andere Möglichkeit, eine logische Ausführung von "und" den ich verpasst habe? Wie ich bereits sagte, scheint die letztere Form richtig zu funktionieren-ich habe mich nur gefragt, ob es eine einfachere Möglichkeit gibt, logisch und die logische Ausführung zu führen. Und die Suche nach "booleschen" "logisch" und "und" auf der Clojure -Google -Gruppe erzielte zu viele Ergebnisse, um sehr verwendet zu werden.

War es hilfreich?

Lösung

In gemeinsamem Lisp und Schema

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

Andere Tipps

Im gemeinsamen LISP ist das Folgende auch eine gemeinsame Idiom:

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

Vergleichen Sie dies mit der Antwort von Doug Curries mit Verwendung (and ... (foo)). Die Semantik ist gleich, aber je nach Rückgabetyp von (foo), Die häufigsten LISP -Programmierer würden einen gegenüber dem anderen bevorzugen:

  • Verwenden (and ... (foo)) in Fällen, wo (foo) Gibt einen Booleschen zurück.

  • Verwenden (when (and ...) (foo)) in Fällen, wo (foo) Gibt ein willkürliches Ergebnis zurück.

Eine Ausnahme, die beweist, dass die Regel Code ist, in dem der Programmierer beide Redewendungen kennt, aber absichtlich schreibt (and ... (foo)) ohnehin. :-)

In Clojure würde ich normalerweise so etwas verwenden wie:

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

Es ist eindeutig möglich, prägnanter zu sein (z. B. Dougs Antwort), aber ich denke, dieser Ansatz ist für die Menschen natürlicher zu lesen - insbesondere wenn zukünftige Leser des Codes einen C ++ - oder einen Java -Hintergrund haben!

Es ist wirklich abgefahren! (and x y) ist ein Makro - Sie können die überprüfen Quellcode bei clojure.org - das erweitert sich auf (if x y false) gleichwertig:

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

(or x y) ist ähnlich, aber umgekehrt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top