Common lisp SBCL编译器诊断消息(缺少带“when”的无正文)

Common lisp SBCL编译器诊断消息(缺少带“when”的无正文),common-lisp,compiler-warnings,sbcl,Common Lisp,Compiler Warnings,Sbcl,我最近在处理when语句时,无意中在我的一个函数中遇到了一个潜在的编码错误。简化的释义可能如下所示: (defparameter a 0) (when (or (= a 0) (= a 1) (* a a))) 问题是括号放错了位置,所以实际上是这样 (when (or (= a 0) (= a 1) (* a a))) 在这种情况下,编译器生成样式警告或注释不是很有用吗?在我看来,语句时的含义通常意味着一个条件和一个主体,即

我最近在处理
when
语句时,无意中在我的一个函数中遇到了一个潜在的编码错误。简化的释义可能如下所示:

(defparameter a 0)

(when (or (= a 0)
          (= a 1)
  (* a a)))
问题是括号放错了位置,所以实际上是这样

(when (or (= a 0)
          (= a 1)
          (* a a)))
在这种情况下,编译器生成样式警告或注释不是很有用吗?在我看来,语句时的
含义通常意味着一个条件和一个主体,即使主体是严格可选的。当然,一个漂亮的印刷品会在编辑器中捕捉到这一点,但我是从其他地方复制的。SBCL不检查此类错误是否有原因

一个漂亮的印刷品会在编辑处发现这一点

为了讨论这些选项,我知道:

  • 将格式化源代码

    (普通格式化程序:fmt:您的系统:取代)

  • 缩进源代码。有一个命令行实用程序。我试过一次,结果还不错,但和Emacs的缩进不同,这让我很恼火

    $cl identify bar.lisp

它链接到,但我对它的结果不太满意

然而,最好的做法是不仅格式化代码并自己重新阅读,而且

根据一组规则运行检查以警告代码气味 这就是我们提出的建议。它可以评论函数或文件。然而:

  • (编辑)它并没有真正的黏液集成,我们必须对一个函数或整个文件进行评论。
    • 如果你喜欢冒险,可以看看我的一个实用工具。测试在REPL中输入的代码片段可能是一种更简单的方法
没有主体时,它没有关于
的规则(我们可以很容易地添加它)

如果发现代码气味,最好运行失败并显示错误状态代码。再一次,我在beta版的一个小项目试图做到这一点,请参阅。现在没有太多的规则,但我只是为此开了一张支票。您可以调用脚本:

$colisper.sh tests/playground.lisp 
它显示错误(但默认情况下不会将其写入到位):


并返回一个退出代码,因此我们可以使用它有一个git钩子或CI管道。

问题是,如果一个人写
(当x时)
(或者任何扩展为
(如果x(progn)nil)
)的代码,这可能是一个错误,但是,当一个程序编写它时,它很可能不是这样的:它可能只是一些边缘情况,程序还没有足够聪明,无法完全优化。编译器处理的大量代码是由程序编写的,而不是由人编写的。

我喜欢lisp批评家的想法。对整个文件进行批判性处理的功能似乎运行良好。如果我想先做(ql:quickload:lisp-critic),您能建议最简单的方法来删除我不关心的规则,并添加我确实关心的新规则吗?节日快乐!我认为您必须克隆lisp critic并编辑规则文件,或者提供此功能。(很好,这里有一个批判整个文件功能)
 |;; when with no body
 |(when (or (= a 0)
 |          (= a 1)
!|     (* a a))
!|  (error "colisper found a 'when' with a missing body. (we should error the script without this rewrite!)"))