Ein Grund, warum Algol-basierte Sprachen die geschweiften Klammern in ihrer eigenen Zeile anregen, besteht darin, mehr Zeilen zwischen den Begrenzungsklammern einzufügen, ohne die geschweiften Klammern verschieben zu müssen. Das heißt, wenn man mit anfängt
if (pred)
{
printf("yes");
}
Es ist einfach mitzukommen und eine weitere Aussage in die geschweiften Klammern einzufügen:
if (pred)
{
printf("yes");
++yes_votes;
}
Wäre die ursprüngliche Form gewesen
if (pred)
{ printf("yes"); }
dann müssten wir zwei Klammern "bewegt" haben , aber mein Beispiel befasst sich mehr mit letzterer. Hier begrenzen die geschweiften Klammern, was beabsichtigt ist, eine Folge von Anweisungen zu sein , die meistens für Nebenwirkungen aufgerufen werden.
Umgekehrt fehlen Lisp Aussagen; Jede Form ist ein Ausdruck , der einen Wert ergibt - auch wenn in einigen seltenen Fällen (unter Berücksichtigung von Common Lisp) dieser Wert absichtlich als "keine Werte" über eine leere (values)
Form ausgewählt wird. Es ist weniger üblich, Sequenzen von Ausdrücken zu finden , als verschachtelte Ausdrücke . Der Wunsch, "eine Abfolge von Schritten bis zum schließenden Begrenzer zu eröffnen", tritt nicht so häufig auf, da mit dem Wegfall von Anweisungen und der Verbreitung von Rückgabewerten der Rückgabewert eines Ausdrucks seltener ignoriert wird selten, um eine Sequenz von Ausdrücken allein auf Nebenwirkungen zu untersuchen.
In Common Lisp ist das progn
Formular eine Ausnahme (wie auch seine Geschwister):
(progn
(exp-ignored-return-1)
(exp-ignored-return-2)
(exp-taken-return))
Hier progn
werden die drei Ausdrücke nacheinander ausgewertet, die Rückgabewerte der ersten beiden werden jedoch verworfen. Man könnte sich vorstellen , dass die letzten schließenden Klammer in einer eigenen Zeile zu schreiben, aber beachten Sie wieder , dass seit der letzten Form hier speziell ist (nicht im Common Lisp Sinn des Seins besondere , obwohl), mit unterschiedlichen Behandlung, es ist wahrscheinlich , dass man möchte hinzufügen , neue Ausdrücke in der Mitte der Sequenz und nicht nur "Hinzufügen eines weiteren am Ende", da Aufrufer dann nicht nur von neuen Nebenwirkungen, sondern auch von einer wahrscheinlichen Änderung des Rückgabewerts betroffen wären.
Um eine grobe Vereinfachung zu erreichen, begrenzen die Klammern in den meisten Teilen eines Lisp-Programms Argumente, die an Funktionen übergeben werden - genau wie in C-ähnlichen Sprachen - und nicht Anweisungsblöcke. Aus den gleichen Gründen neigen wir dazu, die Klammern, die einen Funktionsaufruf in C begrenzen, in der Nähe der Argumente zu belassen, und tun dies auch in Lisp, mit weniger Motivation, von dieser engen Gruppierung abzuweichen.
Das Schließen der Klammern ist weniger wichtig als das Einrücken des Formulars, in dem sie geöffnet werden. Mit der Zeit lernt man, die Klammern zu ignorieren und nach Form zu schreiben und zu lesen - ähnlich wie es Python-Programmierer tun. Lassen Sie sich jedoch nicht von dieser Analogie dazu verleiten, zu denken, dass es sich lohnen würde , die Klammern vollständig zu entfernen . Nein, das ist eine Debatte, für die man am besten aufgehoben ist comp.lang.lisp
.