For a bit of private research, I was reading some papers on MLisp, a Lisp dialect (pre-processor, technically as it simply compiles its input into normal, S-expression Lisp code) based on M-expressions. Given that the first paper I read was published in 1968, it seems that people have been griping about Lisp's parentheses for almost as long as there has been a Lisp to complain about. Of course, as Bjarne Stroustrup said, "There are only two kinds of languages: the ones people complain about and the ones nobody uses."

Some of the original motivations behind MLisp have fallen away. For example, the MLisp User's Manual mentions three motivations (page 2):

  1. The flow of control is very difficult to follow. Since comments are not permitted, the programmer is completely unable to provide written assistance.
  2. An inordinate amount of time is spent balancing parentheses. It is frequently a non-trivial task just to determine which expressions belong to which other expressions.
  3. The notation of LISP is far from the most natural or mnemonic for a language, making the understanding of most routines fairly difficult.

Both Scheme and Common Lisp (pretty much the only remaining living variants of Lisp) provide comments. Since R6RS, Scheme includes multiline comments as well as single line, so this motivation is clearly gone. Two and Three really have no business being separate. They both say that Lisp is hard to read, something that almost thirty years later, to the point where Peter Seibel's 2003 book, Practical Common Lisp briefly addresses this objection near the beginning.

Here is a snippet of the result, from Enea, Horace (1968) MLISP

A:=DO I :=I+1 UNTIL FN(1);
RR:=#:acAD(),READ()>; A:=DO I :=I+1 UNTIL FN(1); B:=COLLECT UNTIL I EQ 'END; WHILE ,((A:=READ()) EQ 'END) DO INFUT(A); C:=WHILE 7((A:=READ()) EQ 'END) COLLECT 4.b; FOR I ON L DO FN(1); J:=FOR I IN L DO FN(I) UNTIL QN(1); FOR I IN 1 BY 4 TO 13 DO FN(1); FOR I IN 1 TO 10 DO FN(1); J:=FOR I IN L COLLECT FN(1); J:=FN(FUNCTION(+), FUNCTIC!N(TIMES)); J:=,<4,<6,8>>> SUB ~,l>; J:=q(a Y 2 ., 3 9 4 ? 5 Y 6Y 7 Y 8 Y gY o>); OFF; END. (Input follows end.)

This MLisp, which looks like an evil union between Pascal and Basic, is the result of one of (if not the) earliest attempts to solve that problem of those pesky parentheses. So, over forty years ago, we get to see two traditions established:

  1. People whining about the parentheses in Lisp
  2. People using Lisp to build DSLs

And the world ever is as it always was.