Вопрос

Один из тех, кто нашел время, чтобы прокомментировать мой другой вопрос О синтаксисе Clojure/LISP отметил, что я не написал свой пример кода в стандартном пути LISP. Поэтому он был достаточно любезен, чтобы переписать фрагмент кода, и это большая помощь. Но это подняло еще один вопрос. Зачем это:

(if (= a something)
  (if (= b otherthing)
    (foo)))

который является стандартным форматированием LISP, будет предпочтительным для этой формы:

(if (= a something)
  (if (= b otherthing)
    (foo)
  )
)

Именно так я бы наивно отформатировал этот код из -за моего фона разработки C ++. Мне интересно, есть ли какая -либо выгода для последнего форматирования или это просто укоренившийся стандарт (например, клавиатура Qwerty). Я не пытаюсь быть аргументативным-мне просто трудно понять, почему первая форма была бы предпочтительной. Вторая форма помогает мне легче увидеть структуру кода.

Это было полезно?

Решение

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

И если вам нужно более внимательно осмотреть вложенные скобки, редактор, который подчеркивает соответствующее скобку, поможет вам. Это также будет проще, когда соответствующий скобка не слишком далеко.

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

Другие советы

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

(a (b (c (d e)
         (f g))
      (h i j))
   (k l m n))

Даже не глядя на скобку, вы можете увидеть, что (d e) а также (f g) параметры для c, (c (d e) (f g)) а также (h i j) параметры для b, а также (b (c (d e) (f g)) (h i j)) а также (k l m n) параметры для a.

С вашим примером он должен быть более правильно отформатирован следующим образом:

(if (= a something)
    (if (= b otherthing)
        (foo)))

    ^   ^
  notice how they line up

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

Простой ответ заключается в том, что ваш путь-это не то, как симпатичный Prime Printer. Наличие одного истинного формата - это всегда хорошая вещь для кода, а макрос Pprint дает вам этот формат, встроенный в язык.

Конечно, потому что Макро Pprint существует, вам не нужно следовать стандартному форматированию кода, потому что люди могут просто запустить ваш код через Pprint и получить то, к чему они привыкли. Однако, поскольку все остальные используют pprint или вручную приблизительно его, вам будет трудно читать код, если вы не сделаете это так же, и у вас нет легкого макроса, который превратит свой код в ваш предпочтительный формат.

Вы можете переформатировать код LISP с помощью пакета sreefctor: Домашняя страница.

Некоторые демонстрации:

Доступные команды:

  • srefactor-lisp-format-buffer: Формат целый буфер
  • srefactor-lisp-format-defun: Формат тока тока Defun Cursor находится в
  • srefactor-lisp-format-sexp: Формат текущий курсор Sexp в.
  • srefactor-lisp-one-line: превратить текущий SexP того же уровня в одну линию; С аргументом префикса рекурсивно превращайте все внутренние полов в одну строчку.

Команды форматирования также используются для общего LISP и схемы.

Если есть какие -либо проблемы, пожалуйста, отправьте отчет о проблеме, и я буду рад его исправить.

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

Когда я раньше программировал LISP, я оставил пространство между заключительными скобками для открытия скобок на той же линии и остальной, чтобы упростить подсчет, например, это:

(if (= a something)
  (if (= b otherthing)
    (foo) ))

Я полагаю, что в наши дни это больше не нужно, поскольку редакторы более полезны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top