Круглые скобки Lisp

Почему Lispers форматируют свой код как показанный в демонстрационном 1 вместо как показано в демонстрационных 2? Мне (и я предполагаю большинству других, происходящих из различной среды программирования, чем Lisp), форматирование, показанное в демонстрационных 2, было бы легче считать. Есть ли какая-либо конкретная причина, почему Lispers предпочитают демонстрационный 1 стиль?

Демонстрационный 1

(defun factorial (n)
  (if (<= n 1)
    1
    (* n (factorial (- n 1)))))

Демонстрационные 2

(defun factorial (n)
  (if (<= n 1)
    1
    (* n (factorial (- n 1)))
  )
)
43
задан 7 revs, 6 users 65% 6 October 2013 в 06:42
поделиться

9 ответов

Среды LISP IDE обычно автоматически балансируют круглые скобки и управляют отступами в зависимости от уровня вложенности. Образец 2 не дает никаких преимуществ в этих ситуациях.

В наследии C / FORTRAN / Pascal вы склонны ставить упор на последовательность, а не на вложение (деревья синтаксического анализа кода более мелкие и широкие). Конец области видимости является более важным событием в вашем коде: поэтому акцент был и все еще в некоторой степени важнее.

33
ответ дан 26 November 2019 в 22:41
поделиться

Для опытных пользователей Lisp уровень вложенности более важен, чем поиск закрывающих скобок. Помещение закрывающих скобок в отдельные строки не очень помогает с уровнями вложенности.

Основная идея состоит в том, что круглые скобки находятся непосредственно вокруг их содержимого.

(a)

, а не

(a
)

Далее следует следующее:

(defun foo (bar)
  (foo (bar (baz
              ...
             )
         ...
        )
    ...
   )
 )

vs.

(defun foo (bar)
  (foo (bar (baz ...) ...) ...))

Одна из основных идей при редактировании текста на Лиспе состоит в том, что вы можете выбрать список, дважды щелкнув скобки (или используя ключевую команду, когда курсор находится внутри выражения или в скобках). Затем вы можете вырезать / скопировать выражение и вставить его в другую позицию в какой-либо другой функции. Следующий шаг - выбрать другую функцию и изменить отступ для функции. Сделанный. Нет необходимости удалять или вводить новые строки для закрывающих скобок. Просто вставьте и измените отступ. Он просто вписывается. В противном случае вы либо потратите время на форматирование кода, либо вам придется переформатировать код с помощью какого-нибудь редактора (так, чтобы закрывающие круглые скобки были на отдельных строках.В большинстве случаев это создает дополнительную работу и мешает перемещению кода.

Есть один случай, когда опытные лисперы когда-нибудь писали закрывающие скобки в своей собственной строке:

(defvar *persons*
   (list (make-person "fred")
         (make-person "jane")
         (make-person "susan")
         ))

Здесь это означает, что можно добавлять новых людей. Поместите курсор непосредственно перед вторыми закрывающими круглыми скобками в последней строке, нажмите c-o (открытая строка), добавьте предложение и сделайте отступ для круглых скобок, чтобы они снова выровнялись. Это избавляет от «проблем» с поиском правильных скобок и последующим нажатием клавиши возврата, когда все скобки закрываются в одной строке.

21
ответ дан 26 November 2019 в 22:41
поделиться

Помимо того факта, что большинство Lisp IDE используют парное соответствие, количество места, которое вы бы использовали для написания любой разумной программы, было бы нелепо! Вы получите запястный туннель от всей прокрутки. Программа из 1000 строк будет близка к миллиону строк кода, если вы поместите все закрывающие круглые скобки в их собственную строку. Это может выглядеть красивее и легче читаться в небольшой программе, но эта идея вообще не будет хорошо масштабироваться.

5
ответ дан 26 November 2019 в 22:41
поделиться

Я столкнулся с такой же дилеммой в PHP, используя фреймворк CakePHP и его многочисленные вложенные array() структуры, иногда с глубиной 5+ слоев. Через некоторое время я понял, что OCD по поводу закрывающей скобки ничего не делает, а только тратит моё драгоценное время на разработку и отвлекает меня от конечной цели. Отступ должен был стать самым полезным аспектом форматирования.

4
ответ дан 26 November 2019 в 22:41
поделиться

Потому что программисты Lisp смотрят на отступ и "форму", а не на скобки.

2
ответ дан 26 November 2019 в 22:41
поделиться

Потому что нет никакой необходимости выстраивать закрывающие скобки. Он ничего не добавляет семантически. Чтобы знать, сколько закрывать, большинство Lispers используют хороший редактор, такой как Emacs, который сопоставляет скобки с закрывающими скобками и, следовательно, делает задачу тривиальной.

В Python вообще нет закрывающих скобок или end ключевых слов, и питонисты живут прекрасно.

15
ответ дан 26 November 2019 в 22:41
поделиться

Сохранение всего пространства кажется основной причиной. Если он почти такой же читаемый (особенно, когда вы привыкли к синтаксису), зачем использовать дополнительные 3 строки.

3
ответ дан 26 November 2019 в 22:41
поделиться

Через некоторое время с Lisp вы больше не замечаете скобок, поэтому в вашем втором примере появляется куча ненужных пробелов в конце Это.В частности, большинство лисперов используют редактор, который знает о круглых скобках и заботится о правильном закрытии форм, поэтому вам, как разработчику, не нужно сопоставлять открывающие и закрывающие круглые скобки, как, например, в C.

Что касается того, должна ли последняя форма быть

(* n (factorial (- n 1)))

или

(* n
   (factorial (- n 1)))

, это в основном зависит от личных предпочтений и от того, сколько вещей происходит в коде (в этом случае я бы предпочел первую только потому, что там в коде так мало что происходит).

9
ответ дан 26 November 2019 в 22:41
поделиться

Просто первая и очевидная причина: 4 LOC в первом случае против 7 LOC во втором.

Любой текстовый редактор, знакомый с синтаксисом LISP, будет выделять совпавшие / несоответствующие скобки, так что проблема не в этом.

3
ответ дан 26 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: