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

有帮助吗?

解决方案

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

(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)上安装这些处理​​程序,以消除所有样式警告。

其他提示

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

经过一番折腾之后
并艰难地浏览那些显然对简单具体示例过敏的人编写的文档
(这似乎是大多数事情的大多数文档)
我认为您需要做的就是禁用 全部 警告
是添加这一行在你的 .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"

rewrite 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, , 我猜。
]

我无法得到SB-EXT:马弗条件下工作的还要多的谷歌搜索后,高度恼人的未定义的变量警告。这一警告驱动器在REPL实验时,所以我做了所有的书都建议我们应该做的我坚果:口齿不清延伸到适合我的需要/喜好

我写我自己setq该闭嘴了SBCL警告,我曾第一个宏:)。我敢肯定有更好的方法来做到这一点,但是这对我的伟大工程,这是怎么回事送到我的〜/ .sbclrc!

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

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

如果警告是所有你关心你可以设置:

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

这将只适用于样式警告,并允许其他警告和条件打印出来。共享同父将自动闷声任何警告。

对于我来说(也可能是其他人),大部分的警告实际上是通过管道输送到标准错误,结果 所以这个沉默恼人输出:点击 sbcl 2>/dev/null/

可替换地,可以通过管道到文件中。结果 sbcl 2>myTempLog.txt

当开始SBCL,问题是,至少在我的配置,亚历山大里喷出方法警告的每吨因为ASDF,亚历山大和readline的redifining警告,无论静音的解决方案。

用户theoski的解决方案(SBCL 2>的/ dev / null的...)工作完全摆脱那些,但警告的费用可能实际上是有用的。

不过,我一直有一个终端作为快速黑客和试验划痕开一个REPL,这是一个的的更好看不到雪崩时加载它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top