Одна из причин, по которой языки на основе Algol поощряют использование фигурных скобок в своей собственной строке, состоит в том, чтобы поощрять добавление большего количества строк между разделительными скобками без необходимости перемещать фигурные скобки. То есть, если начать с
if (pred)
{
printf("yes");
}
легко прийти и добавить еще одно утверждение в фигурные скобки:
if (pred)
{
printf("yes");
++yes_votes;
}
Если бы оригинальная форма была
if (pred)
{ printf("yes"); }
тогда нам пришлось бы «сдвинуть» две скобки, но мой пример больше касается последних. Здесь скобки разграничивают то, что должно быть последовательностью утверждений , в основном вызываемых для побочного эффекта.
И наоборот, Лиспу не хватает заявлений; каждая форма - это выражение , дающее какое-то значение, даже если в некоторых редких случаях (если подумать о Common Lisp) это значение намеренно выбирается как «нет значений» через пустую (values)
форму. Менее часто можно найти последовательности выражений , в отличие от вложенных выражений . Желание «открыть последовательность шагов до конечного разделителя» возникает не так часто, потому что, поскольку операторы уходят и возвращаемые значения становятся все более распространенной валютой, реже игнорируется возвращаемое значение выражения и, следовательно, больше редко можно оценить последовательность выражений только для побочного эффекта.
В Common Lisp progn
форма является исключением (как и его братья и сестры):
(progn
(exp-ignored-return-1)
(exp-ignored-return-2)
(exp-taken-return))
Здесь progn
оценивает три выражения по порядку, но отбрасывает возвращаемые значения первых двух. Вы могли бы представить запись последней закрывающей скобки в отдельной строке, но еще раз обратите внимание, что, поскольку последняя форма здесь особенная ( хотя и не в смысле того , что Common Lisp является особенной ), с особой обработкой, более вероятно, что вы добавите новую выражения в середине последовательности, а не просто «добавление еще одного в конец», так как на вызывающих будут воздействовать не только какие-либо новые побочные эффекты, но скорее вероятное изменение возвращаемого значения.
Делая грубое упрощение, скобки в большинстве частей программы на Лиспе разграничивают аргументы, передаваемые функциям - так же, как в C-подобных языках, - а не разграничивают блоки операторов. По тем же причинам мы стремимся к тому, чтобы скобки, ограничивающие вызов функции в C, были близки к аргументам, так же как и в Lisp, и с меньшей мотивацией отклоняться от этой закрытой группировки.
Закрытие скобок имеет гораздо меньшее значение, чем отступ в форме, в которой они открываются. Со временем каждый учится игнорировать круглые скобки и писать и читать по форме - так же, как это делают программисты на Python. Однако не позволяйте этой аналогии привести вас к мысли, что полное удаление скобок будет иметь смысл. Нет, для этого лучше всего спорить comp.lang.lisp
.