lisp clojure boolean

El Clojure(o Lisp) Equivalente de una prueba booleana compuesta



(4)

En C ++ escribiría algo como esto:

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

¿Estoy en lo cierto al pensar que el equivalente de Clojure es algo como esto?

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

¿O hay otra forma de realizar un "y" lógico que me he perdido? Como dije, la última forma parece funcionar correctamente. Me preguntaba si hay alguna forma más simple de realizar la lógica y. Y la búsqueda de "boolean", "logical" y "and" en Clojure Google Group arrojó demasiados resultados como para ser de mucha utilidad.


En Common Lisp y Scheme

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


En Common Lisp, el siguiente es también un modismo común:

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

Compare esto con la respuesta de Doug Currie usando (and ... (foo)) . La semántica es la misma, pero dependiendo del tipo de retorno de (foo) , la mayoría de los programadores de Common Lisp preferirían uno sobre el otro:

  • Use (and ... (foo)) en los casos en que (foo) devuelva un valor booleano.

  • Use (when (and ...) (foo)) en casos donde (foo) devuelve un resultado arbitrario.

Una excepción que demuestra que la regla es un código donde el programador conoce ambos idiomas, pero escribe intencionalmente (and ... (foo)) todos modos. :-)


¡Es bastante genial! (and xy) es una macro - puede verificar el código fuente en clojure.org - que se expande a (if xy false) equivalente a:

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

(or xy) es similar pero está invertido.


En Clojure normalmente usaría algo como:

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

Es claramente posible ser más conciso (por ejemplo, la respuesta de Doug), pero creo que este enfoque es más natural para las personas para leer, ¡especialmente si los futuros lectores del código tienen un fondo C ++ o Java!