Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
(require '[clojure.string :as str])
(defn rename-underscore [sym]
[(symbol (str/replace (name sym) \_ \-))
(keyword sym)])
(defn udestructure [[lhs expr]]
(if (and (map? lhs)
(vector? (:_keys lhs)))
(let [msym (gensym)
bind-lhs (->> (:_keys lhs)
(map rename-underscore)
(into {}))]
[msym expr
bind-lhs msym
(dissoc lhs :_keys) msym])
[lhs expr]))
(defmacro letu [bindings & body]
(let [bents (partition 2 bindings)]
`(let [~@(mapcat udestructure bents)]
~@body)))
(comment
(letu [{a :a :_keys [ugly_name uglier_long_name]} {:ugly_name :foo
:uglier_long_name :bar
:a :baz}]
(= [ugly-name
uglier-long-name
a]
[:foo :bar :baz])))
;; true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.