On a side note, I was partially inspired by Haskell's do notation, which is imperative-looking syntactic sugar for monadic binds.
On Thursday, 18 October 2012 12:01:33 UTC-4, JvJ wrote: > > I'm not sure if anyone's done this before, but I'm fed up with writing > code that looks like this: > > (let [a 1] > (println "this is a: " a) > (let [b 2] > (println "this is b: " b) > (let [c 3] > (println "this is c: " c) > (+ a b c)))) > > I'd rather do something more like this: > (-:> > (:= a 1) ;; Assign a to 1 > (println "this is a: " a) > (:= b 2) > (println "this is b: " b) > (:= c 3) > (println "this is c: " c) > (+ a b c)) > > > I wrote a macro to do this, but I feel like it's such a simple thing that > someone must have done it before, and it's probably better than mine. > Does anyone know of anything like that? > > Here's the code for it in case anyone wants to use it: > > (ns cljutils.core) > > (defn- form-check > "Ensures the form represents an assignment. > Such as (:= a 1)" > [form] > (and > (= 3 (count form)) > (= := (first form)) > (symbol? (second form)))) > > > (defn- iblk-fn > "Simulates imperative variable-assignments through nested > let statements." > [& forms] > (let [form (first forms) > rforms (rest forms)] > (if-not form > nil > ;; Else > `(do > ~@(if (form-check form) > `((let [~(second form) ~(nth form 2)] > ~(apply iblk-fn rforms))) > (let [[f r] (split-with (comp not form-check) forms)] > (concat > f > (apply iblk-fn r)))))))) > > (defmacro -:> > [& forms] > (apply iblk-fn forms)) > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en