Почему принято ставить много закрывающих скобок в одну строку в языках, основанных на Лиспе? - PullRequest
34 голосов
/ 29 ноября 2010

Обычно код выглядит так:

(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))
)

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

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

Ответы [ 8 ]

46 голосов
/ 29 ноября 2010

В Лиспе и других языках, которые используют 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)))

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

(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)
    )
  )

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

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


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

Фактические символы в скобках - это просто лексические токены, которым следует присвоить небольшое значение.Программисты на Лиспе не проверяют скобки по отдельности или, если не считать Азатота, подсчитывают скобки;вместо этого они рассматривают структуры более высокого уровня, выраженные в программе, особенно те, которые представлены отступом.Лисп не о написании последовательности последовательных инструкций;речь идет о построении сложных структур путем суммирования частей.Композиция сложных структур из частей находится в центре внимания программ на Лиспе, и это должно быть легко видно из кода на Лиспе.Беспорядочно ставить скобки в скобки о презентации - это раздражает программиста на Лиспе, который в противном случае даже не увидел бы их по большей части.

29 голосов
/ 29 ноября 2010

Здесь необходимо сделать два замечания:

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

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

    )  ; end of the loop
    

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

    # end of the loop
    

    на некоторых языках, чувствительных к пробелам, таких как Python

См., например, http://www.gnu.org/software/emacs/manual/html_node/emacs/Expressions.html

11 голосов
/ 29 ноября 2010

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

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

3 голосов
/ 19 марта 2013

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

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

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

3 голосов
/ 29 ноября 2010

Делай, что хочешь! Это твой код.

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

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

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

1 голос
/ 22 декабря 2017

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

1 голос
/ 15 февраля 2016

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

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

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

1 голос
/ 07 сентября 2015

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

...