Come si analizza
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
L'albero di analisi probabilmente sembra qualcosa del genere
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, notazione con prefisso
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
Questo formato dell'albero di analisi è abbastanza facile da manipolare, ma ho un problema. Odio i separatori. Mi piacciono i terminatori. Allo stesso tempo, mi piace spruzzare negli spazi bianchi.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
hmm ... lo spazio bianco aggiuntivo rende alcune cose più difficili da analizzare ... Forse potrei solo fare una regola che l'albero è rappresentato come (foglia foglia foglia radice).
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
Ora la mia serializzazione di un albero di analisi è lisp (rinomina la funzione da applicare, e questo probabilmente funziona). Se voglio programmi che scrivano programmi, è un po 'bello manipolare solo alberi di analisi.
Questo non è interamente il modo in cui sono nate le espressioni s, ma è stato identificato in anticipo, ed è una caratteristica che usano i programmatori lisp. 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 consapevole di s-expression. È più probabile che tu perda traccia di una parentesi graffa di chiusura in un'espressione s rispetto a una parentesi graffa di chiusura in xml ( </foo>
chiude solo <foo>
, ma la parentesi destra chiude QUALSIASI espressione di s). Nella racchetta, l'uso di parentesi quadre per alcune espressioni, combinato con un buon stile di rientro, risolve la maggior parte dei problemi.
La versione lisp:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Non male.