Clojure Destructuring Gotcha

(defn hello
[& {:keys [person]
:or {person "Rich"}}]
(str "Hello, " person))

(hello) => "Hello, Rich"

(hello :person "Hickey") => "Hello, Hickey"

Eu esperava (hello :person nil)ter o mesmo resultado que chamar (hello), mas, ao que parece, Clojure parece fazer uma distinção entre nada e nilquando se trata de desestruturação.

Uma situação do mundo real em que isso poderia ocorrer seria quando você, por exemplo, dependesse do resultado de uma operação de desestruturação para fornecer parâmetros para uma função semelhante a hello. por exemplo

(defn spam
[& {:keys [person]}]
(str (hello :person person)
"Give me all your money."))

Chamar (spam)resultaria em (hello :person nil), o que teria o – provavelmente – efeito indesejado de retornar "Hello, ". Você pode optar por adicionar um :orao desestruturar o argumento para spam, mas então o mesmo código aparecerá duas vezes. Uma solução mais localizada seria mudar a hellodefinição para algo assim.

(defn hello
[& {:keys [person]}]
(str "Hello, " (or person "Rich")))

Isso funcionou no meu caso, mas adoraria ouvir sobre abordagens mais idiomáticas.