tutorial programacion online lenguaje guide example java clojure language-features

programacion - ¿El equivalente de cambio de Java en Clojure?



clojure vs scala (3)

Aunque las sugerencias de @Jan y @mikera para usar ClojureDocs o cond (¿puedo agregar condp a la lista?) Son correctas desde un punto de vista funcional y aunque las limitaciones de case (por ejemplo, los valores de prueba solo pueden ser constantes en tiempo de compilación; un valor de retorno predeterminado) es obligatorio) espejo de los de switch hay algunas diferencias sutiles:

  • case no se puede utilizar con las constantes de Java Enum ;

  • el despacho del caso se basa en hash AFAIK, lo que lo hace comparable a hashmaps en términos de rendimiento; switch es mucho más rápido;

  • no se puede pasar por el case , lo que significa que debe usar otras opciones ( condp con conjuntos de valores?) para reflejar el comportamiento del switch .

[¹] no funcional como en functional-programming funcional, funcional como en el cumplimiento de una función, al servicio de un propósito.

¿Hay un equivalente para la construcción del switch de Java en Clojure? ¿Y si si, que? Si no, ¿tenemos que usar if else ladder para lograrlo?


Pruebe la macro del case :

(case (+ 2 3) 6 "error" 5 "ok")

o con valor predeterminado

(case (+ 2 3) 5 "ok" "error")

Recuerda que según la documentación.

Las constantes de prueba no son evaluadas. Deben ser literales de tiempo de compilación, y no necesitan ser citados. (...)

Ver más ejemplos en ClojureDocs .


ClojureDocs es una buena opción según lo señalado por Jan

cond también es muy útil en muchas circunstancias relacionadas, particularmente si desea activar la evaluación de un rango de diferentes expresiones condicionales, por ejemplo

(defn account-message [balance] (cond (< balance 0) "Overdrawn!" (< balance 100) "Low balance" (> balance 1000000) "Rich as creosote" :else "Good balance"))

Tenga en cuenta que el resultado de cond está determinado por la primera expresión coincidente, por lo que un saldo negativo mostrará "Sobregiro". aunque también coincide con el caso de saldo bajo.

[He editado el código: quité el corchete adicional al final para que funcione]