The name :or implies this should behave as "or" and be "lazy" but it's not the case currently.
The following gist shows the issue. :x is present in the map but we eval the default value:
(defn foo
[{:keys [x]
:or {x (println :set-default)}}]
x)
user> (foo {:x 1})
:set-default
1