Подтвердить что ты не робот

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

Обычно код выглядит следующим образом:

(one-thing
    (another-thing arg1 (f arg5 r))
    (another-thing arg1 (f arg5 r)))

Почему это не так?:

(one-thing
    (another-thing arg1 (f arg5 r))
    (another-thing arg1 (f arg5 r))
)

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

Насколько это плохо, когда я смешиваю код, который использует второй стиль с существующим кодом, который использует первый стиль?

4b9b3361

Ответ 1

Здесь нужно сделать два момента:

  • Соглашения сами по себе важны. Придерживание завернутых символов означает, что ваш код читается другими программистами lisp, и если вы примете этот стиль, вы также будете развивать практику при чтении их

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

    )  ; end of the loop
    

    в lisp больше, чем вам нужно

    # end of the loop
    

    в каком-то чуствительном языке, таком как Python

См. http://www.gnu.org/software/emacs/manual/html_node/emacs/Expressions.html

Ответ 2

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

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

Например,

(defun clone-indirect-buffer-other-window (newname display-flag &optional norecord)
  "Like `clone-indirect-buffer' but display in another window."
  (interactive
   (progn
     (if (get major-mode 'no-clone-indirect)
         (error "Cannot indirectly clone a buffer in %s mode" mode-name))
     (list (if current-prefix-arg
               (read-buffer "Name of indirect buffer: " (current-buffer)))
           t)))
  (let ((pop-up-windows t))
    (clone-indirect-buffer newname display-flag norecord)))

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

(defun clone-indirect-buffer-other-window (newname display-flag &optional norecord)
  "Like `clone-indirect-buffer' but display in another window."
  (interactive
   (progn
     (if (get major-mode 'no-clone-indirect)
         (error "Cannot indirectly clone a buffer in %s mode" mode-name)
       )
     (list (if current-prefix-arg
               (read-buffer "Name of indirect buffer: " (current-buffer))
             )
           t)
     )
   )
  (let ((pop-up-windows t))
    (clone-indirect-buffer newname display-flag norecord)
    )
  )

Я должен добавить, что почти все программисты Lisp используют редактор, который отображает совпадающие скобки, выполняет автоматическое отступы и предоставляет пользовательский интерфейс для работы с сбалансированными выражениями. Например, в Emacs существует M-( для вставки нового выражения, M-) для перемещения за конец текущего выражения, C-M-k для удаления выражения после точки и т.д.

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


Тейлор Р. Кэмпбелл красноречиво выражает это обоснование:

Фактические символы скобок - это просто лексические маркеры, которым нужно присвоить небольшое значение. Lisp программисты не рассматривают скобки индивидуально, или, Azathoth запрещают, подсчитывают скобки; вместо этого они рассматривают структуры более высокого уровня, выраженные в программе, особенно, как представлено отступом. Lisp заключается не в написании последовательности последовательных инструкций; речь идет о создании сложных структур путем суммирования деталей. Состав сложных структур из частей является фокусом программ Lisp, и это должно быть легко видно из кода Lisp. Непосредственное размещение кронштейнов о презентации затруднено программисту Lisp, который в противном случае даже не видел бы их по большей части.

Ответ 3

Короткий ответ. Отклонение от признанных стандартов служит только для отчуждения потенциальных участников. Ни один стиль не оптимально лучше другого.

Длинный ответ: http://blog.fogus.me/2010/08/30/community-standards/

Ответ 4

Делайте то, что вам нравится! Это ваш код.

Тем не менее, вы, вероятно, в конце концов переместите их обратно, чтобы вы могли получить больше материала на экране сразу. Это правда, что вы фактически перестаете видеть скобки через некоторое время.

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

Черт, запишите пару макросов клавиатуры, чтобы поменять весь файл от одного стиля к другому. (И узнайте, как заставить ваш контроль версий игнорировать изменения только в виде пробелов.: -)

Ответ 5

Если вы используете Emacs, вам нужно, чтобы узнать эти. В частности, C-M-k позволяет убить сбалансированное выражение так же просто, как убить строку. Пара, которая с хорошим подчеркиванием сбалансированных круглых скобок, и там действительно не нужно писать вещи таким образом.

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

Если вы не используете Emacs, вы должны хотя бы использовать редактор, который поддерживает эти основные операции, или кодирование в lisp будет больно.

Ответ 6

Важное значение имеет сохранение пространства с вертикальным экраном (и глазом).

Ответ 7

Я думаю, что хороший ответ на этот вопрос задает родственный вопрос:

Почему программисты на Python не кладут глифы, закрывающие их вложенные строки?

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

Ответ 8

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