Jednym z powodów, dla których języki oparte na Algolu zachęcają nawiasy klamrowe we własnej linii, jest zachęcanie do dodawania kolejnych linii między nawiasami klamrowymi bez konieczności przesuwania nawiasów klamrowych. To znaczy, jeśli się zaczyna
if (pred)
{
printf("yes");
}
łatwo jest dołączyć i dodać kolejne oświadczenie w nawiasach klamrowych:
if (pred)
{
printf("yes");
++yes_votes;
}
Gdyby pierwotna forma była
if (pred)
{ printf("yes"); }
wtedy musielibyśmy „przesunąć” dwa nawiasy klamrowe, ale mój przykład dotyczy bardziej tego drugiego. Tutaj nawiasy klamrowe określają, co ma być sekwencją instrukcji , najczęściej wywoływanych ze względu na efekt uboczny.
I odwrotnie, Lisp nie ma instrukcji; każda forma jest wyrażeniem , dającym pewną wartość - nawet jeśli w niektórych rzadkich przypadkach (myśląc o Common Lisp), wartość ta jest celowo wybierana jako „bez wartości” za pomocą pustej (values)
formy. Rzadziej jest znaleźć sekwencje wyrażeń , niż wyrażenia zagnieżdżone . Pragnienie „otwarcia sekwencji kroków aż do zamykającego ogranicznika” nie pojawia się tak często, ponieważ gdy instrukcje znikają, a zwracane wartości stają się bardziej powszechną walutą, rzadziej ignorowane jest zwracane wartości wyrażenia, a tym samym więcej rzadko ocenia się sekwencję wyrażeń pod kątem samego efektu ubocznego.
W Common Lisp progn
forma jest wyjątkiem (podobnie jak jej rodzeństwo):
(progn
(exp-ignored-return-1)
(exp-ignored-return-2)
(exp-taken-return))
Tutaj progn
ocenia trzy wyrażenia w kolejności, ale odrzuca zwracane wartości pierwszych dwóch. Można sobie wyobrazić pisanie tego ostatniego nawiasu zamykającego na jego własnej linii, ale zauważmy jeszcze raz, że ponieważ ostatnia forma jest tutaj wyjątkowa ( choć nie w sensie bycia wyjątkowym ), z wyraźnym traktowaniem, jest bardziej prawdopodobne, że ktoś doda nowy wyrażenia w środku sekwencji, a nie tylko „dodawanie kolejnego na końcu”, ponieważ na osoby dzwoniące miałyby wpływ nie tylko nowe skutki uboczne, ale raczej prawdopodobna zmiana wartości zwracanej.
Znacząco upraszczając, nawiasy w większości części programu Lisp ograniczają argumenty przekazywane do funkcji - tak jak w językach podobnych do C - i nie ograniczają bloków instrukcji. Z tych samych powodów mamy tendencję do trzymania nawiasów ograniczających wywołanie funkcji w C blisko argumentów, podobnie robimy to samo w Lisp, z mniejszą motywacją do odchodzenia od tego ścisłego grupowania.
Zamykanie nawiasów ma znacznie mniejsze znaczenie niż wcięcie formy, w której się otwierają. Z czasem uczy się ignorować nawiasy i pisać i czytać według kształtu - podobnie jak robią to programiści Python. Nie pozwól jednak, aby ta analogia doprowadziła cię do wniosku, że całkowite usunięcie nawiasów byłoby opłacalne. Nie, na tę debatę najlepiej zapisać comp.lang.lisp
.