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.