Соглашение о комментировании на Лиспе - PullRequest
59 голосов
/ 16 июня 2011

Что такое соглашение по Лиспу о том, сколько точек с запятой использовать для комментариев разного типа (и каким должен быть уровень отступа для разного числа точек с запятой)?

Кроме того, существует ли какое-либо соглашение о том, когда использовать комментарии с точкой с запятой и когда использовать #|multiline comments|# (при условии, что они существуют и существуют в нескольких реализациях)?

Ответы [ 5 ]

62 голосов
/ 16 июня 2011

В Common Lisp:

;;;; At the top of source files

;;; Comments at the beginning of the line

(defun test (a &optional b)
  ;; Commends indented along with code
  (do-something a)                      ; Comments indented at column 40, or the last
  (do-something-else b))                ; column + 1 space if line exceeds 38 columns

Примечание: Emacs не очень хорошо распознает #| |#, но, как предлагает Райнер в комментариях, попробуйте вместо этого использовать #|| ||#.

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

Есть хитрый трюк для отключения кода, который заключается в добавлении префикса к выражению #+(or):

(defun test (a &optional b)
  #+(or)
  (do-something a)
  (do-something-else b))

Примечание: #+nil обычно тоже работает, если у вас нет функции nil или :nil. Преимущество #+(or) заключается в том, что вы можете легко редактировать его, либо закомментировав его, либо изменив его на #+(and), либо фактически включив в него набор функций, для которых вы действительно хотите, чтобы это выражение было прочитано.

SLIME помогает здесь, обозначая форму (do-something a) как комментарий, когда у вас запущен Lisp.

Помимо особых синтаксических комментариев и уловок Common Lisp, таких как #| |# и #+(or) или более часто встречающихся #+nil, я считаю, что правила точки с запятой широко распространены и в других списках.


Вот выдержка из спецификации , обратите внимание, как текущая практика изменилась в отношении одной точки с запятой:

2.4.4.2 Заметки о стиле для точки с запятой

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

2.4.4.2.1 Использование одной точки с запятой

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

2.4.4.2.2 Использование двойной точки с запятой

Комментарии, начинающиеся с двойной точки с запятой, выровнены по тому же уровню отступа, что и форма в той же позиции в коде. В тексте такого комментария обычно описывается состояние программы в момент появления комментария, код, следующий за комментарием, или оба.

2.4.4.2.3 Использование тройной точки с запятой

Комментарии, начинающиеся с тройной точки с запятой, выровнены по левому полю. Обычно они используются перед определением или набором определений, а не внутри определения.

2.4.4.2.4 Использование четвертой точки с запятой

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

2.4.4.2.5 Примеры стиля для точки с запятой

;;;; Math Utilities

;;; FIB computes the the Fibonacci function in the traditional
;;; recursive way.

(defun fib (n)
  (check-type n integer)
  ;; At this point we're sure we have an integer argument.
  ;; Now we can get down to some serious computation.
  (cond ((< n 0)
         ;; Hey, this is just supposed to be a simple example.
         ;; Did you really expect me to handle the general case?
         (error "FIB got ~D as an argument." n))
        ((< n 2) n)             ;fib[0]=0 and fib[1]=1
        ;; The cheap cases didn't work.
        ;; Nothing more to do but recurse.
        (t (+ (fib (- n 1))     ;The traditional formula
              (fib (- n 2)))))) ; is fib[n-1]+fib[n-2].
29 голосов
/ 17 июня 2011

Многострочные комментарии # || # часто используются для комментирования больших объемов кода на Лиспе или примера кода.Поскольку некоторые реализации Emacs, похоже, испытывают проблемы с их анализом, некоторые используют # |||| # вместо.

Для использования точек с запятой см. пример комментария в книге Common Lisp the Language (стр. 348), 1984, Digital Press, Гай Л. Стил-младший.:

;;;; COMMENT-EXAMPLE function. 
;;; This function is useless except to demonstrate comments. 
;;; (Actually, this example is much too cluttered with them.) 

(defun comment-example (x y)      ;X is anything; Y is an a-list. 
  (cond ((listp x) x)             ;If X is a list, use that. 
        ;; X is now not a list.  There are two other cases. 
        ((symbolp x) 
        ;; Look up a symbol in the a-list. 
        (cdr (assoc x y)))        ;Remember, (cdr nil) is nil. 
        ;; Do this when all else fails: 
        (t (cons x                ;Add x to a default list. 
                 '((lisp t)       ;LISP is okay. 
                   (fortran nil)  ;FORTRAN is not. 
                   (pl/i -500)    ;Note that you can put comments in 
                   (ada .001)     ; "data" as well as in "programs". 
                   ;; COBOL?? 
                   (teco -1.0e9))))))

В этом примере комментарии могут начинаться с одной до четырех точек с запятой.

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

  • Комментарии с двумя точками с запятой выравниваются по уровню отступа кода.Пространство условно следует за двумя точками с запятой.Такие комментарии обычно описывают состояние программы в этой точке или раздел кода, следующий за комментарием.

  • Тройные точки с запятой выровнены по левому полю.Обычно они документируют целые программы или большие блоки кода.

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

8 голосов
/ 16 июня 2011

Стандартным справочником по стилю Common Lisp, включая правила комментирования, является учебник Питера Норвига и Кента Питмана по по стилю программирования Good Lisp .

6 голосов
/ 16 июня 2011

Вместо того, чтобы описать это здесь, взгляните на эту страницу . Речь идет об Emacs Lisp, но соглашения одинаковы для всех лиспов (и схем).

1 голос
/ 18 января 2019

Раздражает, что люди ссылаются на условные обозначения, не объясняя, что не так с использованием двойных точек с запятой с комментариями в конце строки.

Нет ничего плохого как такового в использовании двойных точек с запятой с так называемыми "полевыми" (в конце строки) комментариями. Это может стать проблемой, хотя, если вы хотите, чтобы комментарии на полях и регулярные комментарии были в одном блоке, например:

   (defn foo []
      (bar) ;; yup, bar
      ;; let's now do a zap
      (zap))

Итак, если вы используете fill-paragraph функцию Emacs - он автоматически выровняет оба этих комментария, как если бы они были одним оператором.

   (defn foo []
      (bar) ;; yup, bar
            ;; let's now do a zap
      (zap))

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

   (defn foo []
      (bar) ; yup, bar
      ;; let's now do a zap
      (zap))

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

...