如何禁用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))
如果你在一个新的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"
(defmacro sq2 (var value)
(let
((value-to-set value))
`(progn
(defvar ,var)
(setq ,var ,value-to-set))))
(sq2 v (princ "hi"))
hi
"hi"
为了清晰起见,我使用了value-to-set
,
但你可以再次使用value
没有问题:
(defmacro sq3 (var value)
(let
((value value))
`(progn
(defvar ,var)
(setq ,var ,value))))
(sq3 v (princ "hi"))
运行这些宏将始终在设置之前定义变量,
所以如果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:MUFFLE-CONDITIONS来处理非常恼人的未定义变量警告。在使用REPL进行实验时,这个警告让我疯狂,所以我做了所有书籍建议我们应该做的事情:扩展lisp以满足我的需求/偏好!
我编写了自己的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)
这仅适用于样式警告,并允许打印其他警告和条件。任何共享同一父级的警告都将自动消除。
对我(以及可能是其他人)来说,大多数警告实际上是通过管道输送到stdErr。
所以这使烦人的输出无声:
sbcl 2>/dev/null/
或者,您可以管道到文件。
sbcl 2>myTempLog.txt
在启动sbcl时,问题是至少在我的配置中,亚历山大会因为asdf,alexandria和readline而吐出一吨方法警告并重新警告警告,而不管静音解决方案。
用户theoski的解决方案(sbcl 2> / dev / null ...)完全可以解决这些问题,但代价是可能实际上有用的警告。
尽管如此,我总是在终端上打开一个repl作为快速破解和试验的划痕,并且在装载它时没有看到雪崩的情况更好。