有关用于不同类型注释的分号数量(以及不同数量的分号的缩进程度应该是多少)的Lisp约定是什么?
此外,是否有关于何时使用分号注释以及何时使用#|multiline comments|#
的约定(假设它们存在且存在于多个实现中)?
答案 0 :(得分:62)
在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并不能很好地证明#| |#
,但正如Rainer在评论中所建议的那样,请尝试使用#|| ||#
。
我认为没有规则可以使用这个,但我认为评论大量代码的速度更快,或者插入一些长分描据,其中分号只会妨碍编辑,如巨大的BNF列表或之类的。
有一个巧妙的技巧来禁用代码,即使用#+(or)
为表达式添加前缀:
(defun test (a &optional b)
#+(or)
(do-something a)
(do-something-else b))
注意:#+nil
通常也有效,除非您碰巧拥有nil
或:nil
功能。 #+(or)
的优点是,您可以通过将其注释掉或将其更改为#+(and)
来轻松编辑,或者实际包含一组您真正想要读取该表达式的功能。< / p>
当你运行Lisp时,SLIME通过将(do-something a)
形式作为注释来帮助这里。
除了Common Lisp的特定评论语法和技巧,例如#| |#
和#+(or)
或更常见的#+nil
,我相信分号规则在其他lisps中也被广泛采用。
以下是the specification的摘录,请注意当前实践在单个分号上的分歧:
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].
答案 1 :(得分:29)
多行评论#| |#通常用于注释掉大量的Lisp代码或示例代码。由于一些Emacs实现似乎无法解析它们,因此有些正在使用#|| || #six。
有关分号的使用,请参阅由Guy L. Steele Jr。撰写的 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))))))
在此示例中,注释可以以一到四个分号开头。
单分号注释全部与右侧的同一列对齐;通常每个评论只涉及它旁边的代码。偶尔评论的时间足以占据两三行;在这种情况下,通常会将注释的连续行缩进一个空格(分号后)。
双分号注释与代码的缩进级别对齐。一个空间通常遵循两个分号。此类注释通常描述该点的程序状态或注释后面的代码部分。
三分号注释与左边距对齐。它们通常记录整个程序或大型代码块。
四分号注释通常表示整个程序或大代码块的标题。
答案 2 :(得分:8)
Common Lisp风格的标准参考,包括评论惯例,是Peter Norvig和Kent Pitman的Tutorial on Good Lisp Programming Style。
答案 3 :(得分:6)
不要在这里描述,而是看看this page。它正在谈论Emacs Lisp,但所有lisps(和方案)的约定都是相同的。
答案 4 :(得分:0)
令人烦恼的是,人们在引用约定时没有解释使用带分号结尾的双分号有什么问题。
使用双分号和所谓的“边距”(行尾)注释本身没有错。但是,如果您想在同一块中包含边距注释和常规注释,则可能会成为问题,例如:
(defn foo []
(bar) ;; yup, bar
;; let's now do a zap
(zap))
因此,如果您使用Emacs的fill-paragraph
功能-它会自动将这两个注释对齐,就好像它们是一条语句一样。
(defn foo []
(bar) ;; yup, bar
;; let's now do a zap
(zap))
那不是您可能想要的。因此,如果改用单个分号:
(defn foo []
(bar) ; yup, bar
;; let's now do a zap
(zap))
它将保持预期的状态。因此,我猜想人们只是制定了一条规则-使用单个分号作为边距注释