_Comment made by: chouser@n01se.net_
The way this patch behaves can be surprising compared to regular maps:
(clojure.walk/prewalk-replace {[:a 1] nil} {:a 1, :b 2})
;=> {:b 2}
(defrecord Foo [a b])
(clojure.walk/prewalk-replace {[:a 1] nil} (map->Foo {:a 1, :b 2}))
;=> #user.Foo{:a 1, :b 2}
Note how the {{[:a 1]}} entry is removed from the map, but not from the record.
Here's an implementation that doesn't suffer from that problem, though it does scary class name munging instead:
https://github.com/LonoCloud/synthread/blob/a315f861e04fd33ba5398adf6b5e75579d18ce4c/src/lonocloud/synthread/impl.clj#L66
Perhaps we could add to the defrecord abstraction to support well the kind of things that synthread code is doing clumsily, and then {{walk}} could take advantage of that.