¿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