Skip to content

Instantly share code, notes, and snippets.

@mikepence
Forked from ghadishayban/für donald.clj
Last active August 29, 2015 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mikepence/c8d3e8103269ee5456bb to your computer and use it in GitHub Desktop.
Save mikepence/c8d3e8103269ee5456bb to your computer and use it in GitHub Desktop.
(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