18

如何禁用所有警告sbcl?额外的输出相当烦人。

4

8 回答 8

10

您可以SB-EXT:MUFFLE-CONDITIONS像 Pillsy 所说的那样使用,另一种选择是通读警告并使用它们来修改您的代码以删除警告。特别是如果它们实际上是警告(而不是优化说明)。

于 2010-03-29T07:37:55.780 回答
10

在对显然对简单的具体示例 (这似乎是大多数事情的大多数文档)
过敏的人编写的文档进行了大量的讨论和苦恼之后,我认为禁用所有警告 所需要做的 就是在文件中添加以下行:


.sbclrc

(declaim (sb-ext:muffle-conditions cl:warning))

要仅禁用样式警告,它是:

(declaim (sb-ext:muffle-conditions cl:style-warning))

(setq x 1)如果您在新的 REPL 中输入,我试图特别禁用出现的警告

; in: SETQ X
;     (SETQ X 1)
; 
; caught WARNING:
;   undefined variable: X
; 
; compilation unit finished
;   Undefined variable:
;     X
;   caught 1 WARNING condition

通过使用这个:

(declaim (sb-ext:muffle-conditions sb-kernel:redefinition-warning))

但它没有用,
(显然redefinition-warning意味着别的)
而且我找不到它应该是什么。
我猜到sb-kernel:undefined-warning
了,但这不存在。

使用宏

另外,
关于@Bogatyr 的回答
(使用宏自动运行defvar
和@spacebat 的评论
(宏对值进行了两次评估)
我有这样的说法:

作为另一个遇到这个问题的新手,
我想做一个演示,显示宏评估两次,
并显示一个只评估一次的版本。


我最初在问题末尾对其进行了编辑,
但它被拒绝了,因为:
“此编辑旨在解决帖子的作者,作为编辑没有意义。它应该写成评论或答案。 "

好吧,您无法回答答案,
但是注释不能占用代码块,
所以我想我应该把它放在这里吗?
)

原来的

(defmacro sq (var value)
  `(progn
      (defvar ,var ,value)
      (setq ,var ,value)))

    (sq v (princ "hi"))
  • 副作用:打印hihi
  • 返回值:"hi"

重写 2 - 只评估一次,总是运行 defvar

(defmacro sq2 (var value)
 (let
   ((value-to-set value))
   `(progn
      (defvar ,var)
      (setq ,var ,value-to-set))))

    (sq2 v (princ "hi"))
  • 副作用:打印hi
  • 返回值:"hi"

重写 3 - 与上面相同,但更难阅读

value-to-set为了清楚起见,我使用了,
但您可以value再次使用而没有问题:

(defmacro sq3 (var value)
 (let
   ((value value))
   `(progn
      (defvar ,var)
      (setq ,var ,value))))

    (sq3 v (princ "hi"))

rewrite 4 - 仅当变量未绑定时才运行 defvar

运行这些宏将始终在设置变量之前定义变量,
因此如果v已经“绑定”但未“定义”
(即您已经使用 引入它setq) ,那么当您使用变量 或重置它
时将不会再收到任何错误消息
setq.


这是仅在变量尚未绑定时才运行的宏版本:defvar

(defmacro sq4 (var value)
  (let
    ((value-to-set value))
    (if (boundp var)
        `(setq ,var ,value-to-set)
        `(progn
           (defvar ,var)
           (setq ,var ,value-to-set)))))

    (sq4 v (princ "hi"))

因此,如果您使用它来设置一个已绑定但未定义的变量,
它将不断给您错误消息。
(这可能是件好事?
就像,出于同样的原因——我不知道——为什么错误信息首先存在。)

[
另外,
我在这些上测试了宏:

(sq4 value           1              )
(sq4 value           'value         )
(sq4 value           'value-to-set  )
(sq4 value           'var           )
(sq4 value-to-set    1              )
(sq4 value-to-set    'value         )
(sq4 value-to-set    'value-to-set  )
(sq4 value-to-set    'var           )
(sq4 var             1              )
(sq4 var            'value          )
(sq4 var            'value-to-set   )
(sq4 var            'var            )

(你知道,检查我没有搞砸并且......做了一些奇怪的事情。)

我试图var用作变量的那些会产生错误。

起初我以为我搞砸了,
但实际上它只是为 SBCL(?) 本身的特殊内容保留的。

(defvar var)得到:

; debugger invoked on a SYMBOL-PACKAGE-LOCKED-ERROR in thread
; #<THREAD "main thread" RUNNING {AB5D0A1}>:
;   Lock on package SB-DEBUG violated when globally declaring VAR SPECIAL while
;   in package COMMON-LISP-USER.
; See also:
;   The SBCL Manual, Node "Package Locks"

所以......如果有疑问,请避免使用符号var,我猜。
]

于 2016-05-04T17:22:49.120 回答
9

这是我用来消除编译时和运行时(加载时)重新定义警告的方法:

(locally
    (declare #+sbcl(sb-ext:muffle-conditions sb-kernel:redefinition-warning))
  (handler-bind
      (#+sbcl(sb-kernel:redefinition-warning #'muffle-warning))
    ;; stuff that emits redefinition-warning's
    ))

按照这种模式,您可以将这些处理程序安装在 cl:style-warning 等超类上,以消除所有样式警告。

于 2010-03-31T18:34:39.090 回答
4

即使经过多次谷歌搜索,我也无法让 SB-EXT:MUFFLE-CONDITIONS 为非常烦人的未定义变量警告工作。在 REPL 进行实验时,这个警告让我发疯了,所以我做了所有书籍建议我们应该做的事情:扩展 lisp 以满足我的需求/偏好!

我编写了自己的 setq 来关闭 sbcl 警告,这是我的第一个宏 :)。我确信有更好的方法可以做到这一点,但这对我来说非常有用,它会直接进入我的 ~/.sbclrc!

(defmacro sq (var value)
  `(progn
      (defvar ,var ,value)
      (setq ,var ,value)))
于 2011-10-03T11:42:31.677 回答
2

你可能想看看SB-EXT:MUFFLE-CONDITIONS

于 2010-03-29T02:28:49.953 回答
1

如果您只关心警告,则可以设置:

(setf sb-ext:*muffled-warnings* 'style-warning)

这仅适用于样式警告,并允许打印出其他警告和条件。任何共享同一父级的警告都将被自动消除。

于 2017-09-05T04:53:06.790 回答
0

对我(可能还有其他人)来说,大多数警告实际上是通过管道传送到 stdErr 的。
所以这消除了烦人的输出:
sbcl 2>/dev/null/

或者,您可以通过管道传输到文件。
sbcl 2>myTempLog.txt

于 2019-03-11T02:54:47.170 回答
-1

启动 sbcl 时,问题是至少在我的配置中,由于 asdf、alexandria 和 readline 的原因,alexandria 会发出大量的方法警告和重新定义警告,而不管静音解决方案如何。

用户 theoski 的解决方案 (sbcl 2>/dev/null ...) 完全可以摆脱这些,但代价是可能实际有用的警告。

尽管如此,我总是在终端中打开一个 repl 作为快速破解和实验的草稿,而且加载它时没有看到雪崩要好得多。

于 2019-07-20T14:15:25.777 回答