Come si analizza 
if (a > b && foo(param)) {
  doSomething();
} else {
  doSomethingElse();
}
 L'albero di analisi probabilmente assomiglia a 
if:
  condition:
    and:
      lt:
        left: a
        right: b
      function:
        name: foo
        param: param
  true-block:
    function:
      name: doSomething
  false-block:
    function:
      name: doSomethingElse
 hmm ... serializziamo questo albero in un elenco, la notazione del prefisso 
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
 Questo formato di albero di analisi è piuttosto facile da manipolare, ma ho un problema. Odio i separatori. Mi piacciono i terminatori. Allo stesso tempo, mi piace spruzzare in spazi vuoti. 
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
 hmm ... lo spazio bianco supplementare rende più difficile l'analisi di alcune cose ... Forse potrei semplicemente stabilire che l'albero è rappresentato come (foglia foglia di foglia). 
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
 Ora la mia serializzazione di un albero di analisi  è  lisp (si rinomina la funzione da applicare, e questo probabilmente funziona). Se voglio programmi che scrivono programmi, è piuttosto bello manipolare gli alberi di analisi. 
 Questo non è esattamente il modo in cui sono state create le espressioni S, ma è stato identificato in anticipo, ed è una delle funzionalità utilizzate dai programmatori. I nostri programmi sono pre-analizzati in un certo senso e scrivere programmi per manipolare i programmi è abbastanza facile a causa del formato. Ecco perché la mancanza di sintassi è talvolta considerata un punto di forza. 
 Ma come ha detto David, usa un editor che conosca le espressioni S. È più probabile perdere traccia di una parentesi graffa di chiusura in un'espressione s rispetto a una parentesi graffa chiusa in xml (   </foo>    chiude solo   <foo>   , ma il diritto paren chiude QUALSIASI espressione s). In racchetta, l'uso di parentesi quadre per alcune espressioni, insieme a un buon stile di indentazione, risolve molti problemi. 
 La versione lisp: 
(if (and (< a b) (foo param))
  (doSomething)
  (doSomethingElse))
 Non male.