Last active
December 25, 2015 13:49
-
-
Save ghadishayban/6986030 to your computer and use it in GitHub Desktop.
Destructure ugly JSON keys with underscores as symbols with dashes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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 |
it might be a better API to specify :_keys [with-dashes] that way no underscore symbols are seen in the code, and there is congruity between binding symbols and the expr symbols...
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
complete with inscrutable symbol names in the macro