如何在lisp中禁用警告(sbcl)

时间:2010-03-29 02:25:24

标签: debugging lisp common-lisp sbcl

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

8 个答案:

答案 0 :(得分:10)

您可以使用SB-EXT:MUFFLE-CONDITIONS作为Pillsy说,另一种方法是阅读警告并使用它们来修改代码以删除警告。特别是如果它们实际上是警告(而不是优化注释)。

答案 1 :(得分:8)

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

(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,以消除所有样式警告。

答案 2 :(得分:5)

经过多次讨伐 并且通过显然对简单具体例子过敏的人所写的文件进行讨论 (这似乎是大多数事情的大多数文件)
我认为你需要做的就是禁用所有警告 将此行添加到.sbclrc文件中:

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

仅禁用样式警告,它是:

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

如果您在新的REPL中输入(setq x 1)

,我会尝试专门禁用出现的警告

; 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 - 只进行一次eval,总是运行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"))

重写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 ]

答案 3 :(得分:3)

即使经过大量谷歌搜索,我也无法获得SB-EXT:MUFFLE-CONDITIONS来处理非常恼人的未定义变量警告。当我在REPL上进行实验时,这个警告让我疯狂,所以我做了所有书籍建议我们应该做的事情:扩展lisp以满足我的需求/偏好!

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

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

答案 4 :(得分:2)

您可能希望查看SB-EXT:MUFFLE-CONDITIONS

答案 5 :(得分:0)

如果您关注的是警告,可以设置:

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

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

答案 6 :(得分:0)

对于我(可能还有其他人)来说,大多数警告实际上都已通过管道传递到stdErr。
因此,这消除了恼人的输出:
sbcl 2>/dev/null/

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

答案 7 :(得分:-1)

启动sbcl时,问题在于,至少在我的配置中,亚历山大使用asdf,亚历山大和readline发出了大量的方法警告和重新定义警告,而与静音解决方案无关。

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

不过,我总是在终端上打开一个副本,以便快速进行黑客入侵和实验,这是 LOT 更好的选择,它在加载时没有看到雪崩。