Wie analysierst du?
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
Der Analysebaum sieht wahrscheinlich so aus
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
hmm ... lassen Sie uns diesen Baum in eine Liste mit Präfixnotation serialisieren
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
Dieses Analysebaumformat ist ziemlich einfach zu manipulieren, aber ich habe ein Problem. Ich hasse Trennzeichen. Ich mag Terminatoren. Gleichzeitig streue ich gerne in Leerzeichen.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
hmm ... das zusätzliche Leerzeichen erschwert das Parsen bestimmter Dinge ... Vielleicht könnte ich einfach eine Regel aufstellen, dass der Baum als (Wurzelblatt Blattblatt) dargestellt wird.
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
Nun meine Serialisierung eines Parse - Baums ist Lisp (Umbenennungsfunktion anzuwenden, und dies wahrscheinlich läuft). Wenn ich Programme möchte, die Programme schreiben, ist es nett, nur Analysebäume zu manipulieren.
Dies ist nicht ganz der Grund, warum S-Ausdrücke entstanden sind, aber es wurde früh erkannt und es ist eine Funktion, die Lisp-Programmierer verwenden. Unsere Programme sind in gewissem Sinne vorab analysiert, und das Schreiben von Programmen zum Bearbeiten von Programmen ist aufgrund des Formats ziemlich einfach. Deshalb wird der Mangel an Syntax manchmal als Stärke angesehen.
Verwenden Sie jedoch, wie David sagte, einen S-Ausdruck-fähigen Editor. Es ist wahrscheinlicher, dass Sie den Überblick über eine schließende Klammer in einem S-Ausdruck verlieren als über eine schließende Klammer in XML ( </foo>
schließt nur <foo>
, aber der rechte Paren schließt JEDEN S-Ausdruck). Bei Schlägern werden die meisten Probleme durch die Verwendung eckiger Klammern für einige Ausdrücke in Verbindung mit einem guten Einrückungsstil behoben.
Die Lisp-Version:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Nicht so schlecht.