Alex, I just thought of something. I think we're all forgetting the amount of hacking done at the REPL.
;This is easy to type user=>(from (too (many (parens)))) ;Uh-oh user=>to too many nesting levels? This might be an area where the parens are a win. Sean On Dec 20, 10:05 am, "Alex Osborne" <a...@meshy.org> wrote: > Martin Coxall <pseudo.m...@me.com> writes: > > I might try to knock up "optional parens inference for Clojure" and > > add in some manner of curly infix as an exercise. It doesn't look like > > it will be too hard. Since {} is taken for literal maps, I'd need > > something else for curly infix. [|...|], %...%, $...$? > > Let's just try a few example functions from contrib. > > (defn subset? > "Is set1 a subset of set2?" > [set1 set2] > (and (<= (count set1) (count set2)) > (every? set2 set1))) > > Drop the outer parens. > > defn subset? > "Is set1 a subset of set2?" > [set1 set2] > and (<= (count set1) (count set2)) > (every? set2 set1) > > Lets break after "and" so we can drop some more parens. > > defn subset? > "Is set1 a subset of set2?" > [set1 set2] > and > <= (count set1) (count set2) > every? set2 set1 > > Now lets introduce infix with say, |...|. > > defn subset? > "Is set1 a subset of set2?" > [set1 set2] > and > |(count set1) <= (count set2)| > every? set2 set1 > > Maybe they need spaces? > > defn subset? > "Is set1 a subset of set2?" > [set1 set2] > and > | (count set1) <= (count set2) | > every? set2 set1 > > Has that suddenly made things more readable? Maybe. I don't know. It > certainly felt really weird writing it. That "and" by itself does > remind me of Haskell. The code is definitely looking very tree-like > now, maybe that's a good thing? My eyes *are* jumping to the "words" > easier and it's definitely less noisy. > > Yet, this no longer obviously looks like a list. Is that bad? I don't > know. Do we need to be constantly reminded our code has a list > representation? Does it make macros harder to think about? > > Lets try some more examples. How about arity overloading? > > defn reductions > "Returns a lazy seq of the intermediate values of the reduction (as > per reduce) of coll by f, starting with init." > [f coll] > if (seq coll) > rec-seq self (cons (first coll) (map f self (rest coll))) > cons (f) nil > [f init coll] > rec-seq self (cons init (map f self coll)) > > Or a macro? > > defmacro rec-seq > "Similar to lazy-seq but binds the resulting seq to the supplied > binding-name, allowing for recursive expressions." > [binding-name & body] > `let [s# (atom nil)] > reset! s# (lazy-seq (let [~binding-name @s#] ~...@body)) > > It becomes weirdly tempting to insert more line breaks just to get rid > of the rest of the parens. > > defmacro rec-seq > "Similar to lazy-seq but binds the resulting seq to the supplied > binding-name, allowing for recursive expressions." > [binding-name & body] > `let [s# (atom nil)] > reset! s# > lazy-seq > let [~binding-name @s#] ~...@body > > Hmm. Have we solved anything? Will this just make the complaints go > > (from (too (many (parens)))) > > to > too > many > nesting > levels? -- 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