Comment analysez-vous
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
L'arbre d'analyse ressemble probablement à quelque chose comme
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
hmm ... sérialisons cet arbre dans une liste, notation de préfixe
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
Ce format d'arbre d'analyse est assez facile à manipuler, mais j'ai un problème. Je déteste les séparateurs. J'aime les terminateurs. En même temps, j'aime saupoudrer dans les espaces.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
hmm ... l'espace blanc supplémentaire rend certaines choses plus difficiles à analyser ... Peut-être que je pourrais simplement faire une règle selon laquelle l'arbre est représenté comme (racine feuille feuille feuille).
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
Maintenant, ma sérialisation d'un arbre d'analyse est lisp (renommer la fonction à appliquer, et cela s'exécute probablement). Si je veux des programmes qui écrivent des programmes, c'est plutôt sympa de simplement manipuler les arbres d'analyse.
Ce n'est pas entièrement ainsi que les expressions s sont apparues, mais elles ont été identifiées très tôt, et c'est une fonctionnalité que les programmeurs lisp utilisent. Nos programmes sont pré-analysés dans un certain sens, et écrire des programmes pour manipuler des programmes est assez facile à cause du format. C'est pourquoi le manque de syntaxe est parfois considéré comme une force.
Mais comme l'a dit David, utilisez un éditeur prenant en charge l'expression s. Vous risquez plus de perdre la trace d'une accolade fermante dans une expression s que d'une accolade fermante en xml ( </foo>
ferme uniquement <foo>
, mais le paren droit ferme TOUT expression s). En raquette, l'utilisation de crochets pour certaines expressions, associée à un bon style de retrait, résout la plupart des problèmes.
La version lisp:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Pas mal.