Como você analisa
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
A árvore de análise provavelmente se parece com algo como
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
hmm ... vamos serializar esta árvore em uma lista, notação de prefixo
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
Esse formato de árvore de análise é muito fácil de manipular, mas eu tenho um problema. Eu odeio separadores. Eu gosto de terminadores. Ao mesmo tempo, gosto de borrifar espaço em branco.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
hmm ... o espaço em branco adicional dificulta a análise de algumas coisas ... Talvez eu pudesse estabelecer uma regra de que a árvore é representada como (folha de folha de raiz).
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
Agora minha serialização de uma árvore de análise é lisp (renomeie a função a ser aplicada, e isso provavelmente é executado). Se eu quiser programas que escrevam programas, é bom manipular árvores de análise.
Não é exatamente assim que as expressões s surgiram, mas foram identificadas mais cedo e é um recurso que os programadores lisp usam. Nossos programas são pré-analisados em algum sentido, e escrever programas para manipular programas é bastante fácil por causa do formato. É por isso que a falta de sintaxe às vezes é considerada uma força.
Mas, como David disse, use um editor com reconhecimento de expressão s. É mais provável que você perca o controle de uma chave de fechamento em uma expressão s do que uma chave de fechamento em xml ( </foo>
apenas fecha <foo>
, mas o parêntese direito fecha QUALQUER expressão s). Na raquete, o uso de colchetes para algumas expressões, associado ao bom estilo de indentação, corrige a maioria dos problemas.
A versão lisp:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Não é tão ruim.