It's not a bad habit. It's just more practical.
Lisp lists are a data structure. One for example types code&data and computes with an interactive Read Eval Print Loop.
That's what one would write:
CL-USER 35 > (+ (expt 23 2.4) (sin (* 44 0.23 22)))
1854.5603
No one would type:
CL-USER 36 > (+ (expt 23 2.4) (sin (* 44 0.23 22
)
)
)
Also when Lisp deals with s-expressions, the more compact notation is more useful: here Lisp does the layout itself:
CL-USER 46 > (let ((*PRINT-RIGHT-MARGIN* 30))
(pprint '(+ (EXPT 23 2.4) (SIN (* 44 0.23 22)) (COS (+ 12 0.43 19.0)) (TAN (/ 1.4 0.77 3/4)))))
(+ (EXPT 23 2.4)
(SIN (* 44 0.23 22))
(COS (+ 12 0.43 19.0))
(TAN (/ 1.4 0.77 3/4)))
It's not
(+ (EXPT 23 2.4
)
(SIN (* 44 0.23 22
)
)
(COS (+ 12 0.43 19.0
)
)
(TAN (/ 1.4 0.77 3/4
)
)
)
Above is much harder to read and wastes a huge amount of space on the screen. Imagine that lists of are much longer and deeper nested. Finding the corresponding parentheses is usually done by using the editor (select a whole expression, have blinking or colored parentheses, etc.).
The main difference between Lisp and most other programming languages is that programs are written as a data structure: nested lists. Not only that: they are not static lists, but we can compute with them - that's the main appeal. It's a programming language, where it's easy and common to manipulate lists, even programs as lists. Thus the notation has not only be useful for reading code, but also for input/output by humans and programs. There a compact notation is much more useful, since tools will often create huge amounts of nested lists. For example imagine a macro for some Lisp functionality, like a complex loop expression. The macro expanded code can often be ten times larger as the input expression, yet we may want to see it in a debugger -> write that expression in a compact way.
I let Lisp indent my code and the system-wide standard indentation makes it easier to spot parentheses errors, since all code has the same shape rules.
(progn
(case foo
(var (eval foo)))
(fn (apply foo args)))
Since all code gets indented during typing, I can easily see that there is one parenthesis too much in the first case clause...
I wouldn't care to see the parentheses aligned and it makes the problem often more difficult to spot:
(progn
(case foo
(var (eval foo
)
)
)
(fn (apply foo args
)
)
)
I want the expressions to use less vertical space, so that I can see that the opening parentheses of the CASE clauses align. Anything else is just visual clutter.