clojure idioms

¿Cuál es el Clojure idiomático para "foo=bar || baz ”?



idioms (3)

Quiero proporcionar un valor predeterminado que se puede anular. Sé que puedo usar un ternario, como este:

(def foo (if (not (nil? bar)) bar baz))

Pero seguramente hay una manera más idiomática en Clojure de decir "use bar, o baz si bar es nulo.

¿Alguna sugerencia?


Esto asignará bar menos que sea nil o false , y baz contrario.

(def foo (or bar baz))

EDITAR

Si desea verificar con precisión el valor nil , puede optimizar ligeramente su código original, de esta manera:

(def foo (if (nil? bar) baz bar))

Creo que este es el camino más corto posible, aunque no idiomático.


Su pregunta no se refiere específicamente a múltiples vars, pero si desea esta configuración predeterminada para más de una var, la forma idiomática de hacerlo es usar la desestructuración en el mapa con :or valores predeterminados.

por ejemplo, tome esta función que toma un argumento de mapa m , el mapa esperado tiene claves de :a :b , & :c pero si :b y / o :c no se suministran, los valores predeterminados se toman de la cláusula :or

(defn foo [m] (let [{:keys [a b c], :or {b 100 c 200}} m] (println "a:" a) (println "b:" b) (println "c:" c))) user> (foo {:a 1 :b 2}) a: 1 ; no default, use supplied value b: 2 ; value supplied, default ignored c: 200 ; no value supplied, use default from :or nil


fnil también es una opción:

user> (def default-to (partial fnil identity)) #''user/default-to user> (let [bar :foo baz :default] ((default-to baz) bar)) :foo user> (let [bar nil baz :default] ((default-to baz) bar)) :default