I'm reminded gigamonkey's footnote about when functions get too big:

"A friend of mine was once interviewing an engineer for a programming job and 
asked him a typical interview question: how do you know when a function or 
method is too big? Well, said the candidate, I don't like any method to be 
bigger than my head. You mean you can't keep all the details in your head? No, 
I mean I put my head up against my monitor, and the code shouldn't be bigger 
than my head." [1]

There are many different styles for source code, but my experience with lisp 
suggests that variable indentation (as provided by emacs lisp-mode or 
clojure-mode) and parens-not-on-their-own-line makes for much more readable 
code. core.clj is a good example where the code is generally readable, but I 
shudder to think what it would be like to read the code for doseq or 
destructure if each closing parenthesis were on its own line.

And, as for writing code, I couldn't live without paredit.

To each their own, but let's not go down the route of saying "hey, you're code 
formatting style sucks, but I don't want to start a flame war" :).

Cyrus

1. http://www.gigamonkeys.com/book/practical-a-simple-database.html

On Aug 18, 2010, at 6:24 PM, wwmorgan wrote:

> The Incanter example is confusing for the same reason that the
> Leiningen example from the blog post is confusing, and I don't think
> paren style matters at all. The functions have grown over time,
> they're now too big, and they need to be refactored into several
> smaller functions. The paren style is a red herring. core.clj is
> readable because its functions are short.
> 
> When your code makes you want to outdent, you can take this as a
> signal that your function has gotten too big and needs to be
> refactored.
> 
> - Will Morgan
> 
> On Aug 18, 4:36 pm, Greg <g...@kinostudios.com> wrote:
>>> Now the question you're asking is, why don't lispers write
>>>  (MyFactory somearg
>>>  )
>>> which makes me cringe.
>> 
>> That's not at all what's being suggested -- you'll find that both in the 
>> OP's code and in the link below, there are many locations where closing 
>> parenthesis are ended on the same line.
>> 
>> Trailing parens are placed only for certain blocks that traditionally would 
>> define a "scope" in another language, and this is convenient for many 
>> reasons, including generic reasons not attached to any specific language. 
>> It's not about carrying over "much loved C style" to Lisp, but to make 
>> actual use of parenthesis for the purpose of clearly outlining the structure 
>> of your code.
>> 
>> Again, the link goes much more into depth on this.
>> 
>> Attached is a screenshot of some code from the wonderful Incanter library. I 
>> think it's a great illustration of how confusing stacking parenthesis can be 
>> (there are many functions in there that are like this).
>> 
>> The readability issue occurs when there's a drop in several indentation 
>> levels after many lines.  This is a problem regardless of what the 
>> indentation width is, but is certainly made worse by a small indentation 
>> width.
>> 
>> - Greg
>> 
>>  Screen shot 2010-08-18 at 1.32.09 PM.png
>> 48KViewDownload
>> 
>> 
>> 
>> On Aug 18, 2010, at 1:17 PM, Tim Daly wrote:
>> 
>>> A more serious answer is that when I code in Java I use the
>>> brace-on-a-line kind of indentation. When I code in Lisp I
>>> never write single-line parens of any kind.
>> 
>>> I find that I think differently in each language.
>> 
>>> My Java code is always a pile of declare-this, do-this, do-this, return
>>> Thus I find that I'm delimiting the scope of my variables, marking my
>>> control flow and branching logic, try/catch logic, class boundaries, etc.
>> 
>>> My Lisp code mixes control flow and data structures in the same syntax.
>>> Thus the idea that parens are some kind of control flow delimiter is
>>> not particularly meaningful.
>> 
>>> To see the alternative case, take a Java program, find every function call
>>> such as:
>>>   MyFactory(somearg);
>>> throw away the ';', and move the paren left to get:
>>>  (MyFactory somearg)
>> 
>>> Now the question you're asking is, why don't lispers write
>>>  (MyFactory somearg
>>>  )
>>> which makes me cringe.
>> 
>>> A second reason is that Lisp allows you to think things that Java
>>> does not. Java has this imperative, object-oriented, hierarchical
>>> style of writing. My lisp code sytle varies to fit the problem.
>>> Sometimes it is imperative, sometimes functional, sometimes OO,
>>> sometimes snobol-like pattern matching, sometimes class-based.
>>> Occasionally I dynamically construct the code and execute it inline.
>>> Or I use macros to create my own problem language and code in that.
>>> And I create my data structures "on the fly" inline to the code.
>> 
>>> Once you really internalize lisp there are no real constraints
>>> on what you think or write. Thus there is no question of "bracing
>>> style" that is meaningful.
>> 
>>> The whole idea of "bracing style" is Java-think. Your language
>>> choice has given you an OO-procedural mindset. So when you reach
>>> for Lisp you want to see what you have come to expect. People who
>>> work with bricks (Java) tend to wonder why they don't find bricks
>>> among people who work with modelling clay (Lisp). The answer isn't
>>> in the material, it is in your mindset.
>> 
>>> Just by looking at lisp code I can tell what your native language
>>> is. Fortran programmers simulate COMMON blocks, C programmers use
>>> things as pointers, etc. "You can write Fortran in any language"
>>> is a famous quote but "you can't write Lisp in any language". And
>>> you can quote me on that. (But only in my obituary :-) )
>> 
>>> In fact, I think that this is going to be the hardest barrier
>>> to the adoption of Clojure. "Real Java Programmers" are not going
>>> to like the bracing style (or lack thereof) in Clojure.
>> 
>>> Tim Daly
>> 
>>> Greg wrote:
>>>> It's almost purely community convention that has been adopted from Lisp.
>> 
>>>> You may be interested in this link:
>> 
>>>> http://gregslepak.posterous.com/on-lisps-readability
>> 
>>>> There is much discussion about this topic there.
>> 
>>>> Cheers,
>>>> Greg
>> 
>>>> On Aug 18, 2010, at 2:09 AM, michele wrote:
>> 
>>>>> Wouldn't that make it easier to keep track of them.
>> 
>>>>> Example:
>> 
>>>>> (defn myfn-a [a b]
>>>>> (if (zero? b)
>>>>>   a
>>>>>   (recur
>>>>>     (afn (bfn (...)) a)
>>>>>     (dec b))))
>> 
>>>>> (defn myfn-b [a b]
>>>>> (if (zero? b)
>>>>>   a
>>>>>   (recur
>>>>>     (afn (bfn (...)) a)
>>>>>     (dec b)
>>>>>   )
>>>>> )
>>>>> )
>> 
>>>>> --
>>>>> 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
>> 
>>> --
>>> 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
>> 
>> 
> 
> -- 
> 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

-- 
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

Reply via email to