Clojure代码注释中的;和;;有什么区别?

76

;;;在Clojure中开头用于注释有何区别?我发现我的文本编辑器对它们进行了不同的颜色标记,所以我假设它们之间有某种概念上的区别。

我还看到Marginalia对它们进行了不同的处理:

; Stripped entirely
;; Appears in text section of marginalia
(defn foobar []
   ; Appears in code section of marginalia output
   ;; Again, appears in code section of marginalia output
   6)
7个回答

89

就解释器而言,这些符号并没有区别。可以将 ;;;;;;;;;; 视为不同的标题级别。

以下是我个人的使用惯例:

;;;; Top-of-file level comments, such as a description of the whole file/module/namespace

;;; Documentation for major code sections (i.e. groups of functions) within the file.

;; Documentation for single functions that extends beyond the doc string (e.g. an explanation of the algorithm within the function)

; In-line comments possibly on a single line, and possibly tailing a line of code

我猜我必须将其标记为正确,考虑到得到的赞数。一个外部参考会很好,但我想这是一种未被书面化的文化习惯。 :) - pauldoo
4
作为参考,Peter Norvig 是《Good Lisp Programming Style》等许多著作的作者,他将这个约定称为“准标准”。https://dev59.com/_m855IYBdhLWcg3wGQXY#4531930 - orftz
1
那么为什么文档中没有提到单个 ; 呢?https://clojuredocs.org/clojure.core/comment - matanster
@matanster 那个链接是关于 (注释) 而不是 ; 的。但是值得一提的是,在最大的示例中的第二段确实讨论了单个 ;。有关 ; 读取宏的规范文档,请查看 https://clojure.org/reference/reader#macrochars。 - G__

34

查看elisp中;;;的含义的官方描述:由于Clojure缩进器基本相同,因此它们会被类似地处理。如果您要编写一个跨越多行但应视为单个实体的长句/描述,请使用;。他们的示例是:

(setq base-version-list                 ; there was a base
      (assoc (substring fn 0 start-vn)  ; version to which
             file-version-assoc-list))  ; this looks like
                                        ; a subversion

缩进器会确保它们相互之间对齐。如果您想要将几个无关的单行注释放在一起,请使用;;

(let [x 99 ;; as per ticket #425
      y "test"] ;; remember to test this
  (str x y)) ;; TODO actually write this function

16

Emacs用于行末注释,如果这不是你的意图,它会以令人惊讶的方式进行缩进。而;;则不会,所以我通常使用;;。

Clojure不在乎——从;到行尾的任何内容都会被忽略。

我相信Common Lisp中有一种传统,即使用越来越多的分号表示更重要的注释/部分。


7

语言中没有意义。 ;comment的读取宏。也许其他工具可以解析它们,但是“在Clojure内部”,它们是相同的。


6
在包括clojure-mode在内的emacs lisp模式中,;; 的格式约定是出现在行首,并根据上下文像任何其他行一样缩进。期望在行尾使用;,因此如果您在行首放置单个分号注释并期望它制表符到当前上下文的缩进,则emacs将不会按您所希望的方式工作。
(let [foo 1]
  ;; a comment
  foo) ; a comment

6

从Clojure的角度来看,它们没有区别。我发现;;;更显眼,但这仅是我的个人意见。

另一方面,Marginalia会因为有时候注释应该保留在代码部分(例如许可证),所以将其标记为;。这是一个任意的决定,并且可能会在未来改变。


3
请注意fogus关于emacs的评论中,Alex Miller提到了一个细节。它会对单个分号(;)进行缩进,但不会对两个分号(;;)或三个分号(;;;)进行缩进。如果您自己不使用emacs,请了解它的自动缩进方案,因为您的目标用户中很多人会使用它。 - John Lawrence Aspden

1

我不确定(没有用过Clojure也从未听说过这个),但此讨论串 可能 有所帮助。


这些样式看起来与变宽字体完全不兼容。我希望Clojure社区没有采用列对齐的方式来注释。 - pauldoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接