append[listvar;(PARIS BERLIN NEWYORK TOKYO)]
The arguments are enclosed in square brackets. The second argument is written as an S-Expression. S-Expressions were the data notation and were enclosed in parentheses. Symbols were upper case. The names of operators and variables were lower case.The append call then looked like this:
(APPEND LISTVAR (QUOTE (PARIS BERLIN NEWYORK TOKYO)))
A conditional would have been: [eq[car[l];0] → cons[(ZERO);cdr[l]]; T → x]
Which in S-expression only syntax is: (COND ((EQ (CAR L)) (CONS (QUOTE (ZERO)) (CDR L)))
(T X))
As you can see the conditional would have a special infix syntax.> Because of the limitations of the character sets available in old computers, the round parentheses have a dual role in LISP, as delimiters for lists that are data and as delimiters for the lists of arguments used by function/macro invocations.
No, the syntax above wasn't actually implemented at first. The M-Expression/S-Expression combination was hand translated into S-Expressions, since the Interpreter and Compiler took lists as input.
The reason why the syntax is like this is not a lack of characters or so. The reason is because the language early on worked on code as list data and not on code as text. The input and output was then of list data. The famous "Read Eval Print Loop" reads data, evaluates it and prints the result in data format.
It was thought that a later version of LISP had the M-Expression/S-expression syntax as surface syntax. But that did not get any traction, because the S-expressions would be visible in the programming tools anyway: debugger, code inspector, code stepper. Thus it was more convenient to stay in the s-expression syntax, than to convert S-Expressions both from and into M-Expressions/S-Expressions.
For example a stepper for LISP code might look like this. :s is the single step command:
CL-USER 8 > (step (plus (minus 10 20) (plus 20 30)))
(PLUS (MINUS 10 20) (PLUS 20 30)) -> :s
(MINUS 10 20) -> :s
10 -> :S
10
20 -> :S
20
(- A B) -> :s
A -> :S
10
B -> :s
20
-10
-10
(PLUS 20 30) ->
and so on. The interpreter internally sees Lisp code as lists and just prints the lists while it steps the code...If we wanted M-Expressions, then the things would needed to be converted everywhere/everytime, which is much less elegant than leaving everything in one notation.
LISP 2 was an effort to modernize LISP and to switch to a different syntax.