Common lisp sbcl-如何消音”的英文缩写;未定义变量";警告

Common lisp sbcl-如何消音”的英文缩写;未定义变量";警告,common-lisp,sbcl,suppress-warnings,Common Lisp,Sbcl,Suppress Warnings,我不知道如何在sb ext:muffle条件下执行此操作。我想这样做: (declaim #+sbcl(sb-ext:muffle-conditions sb-kernel:redefinition-warning)) 当然,除了我想掩盖“undefined variable”警告,而不是重新定义 如果有人知道这是什么参数,或者有到sb ext:muffle conditions的文档/各种选项的链接,请分享:)谢谢我不确定您是否能够特别地消除这种类型的警告,至少是通过类名。通过跟踪warn,

我不知道如何在
sb ext:muffle条件下执行此操作。我想这样做:

(declaim #+sbcl(sb-ext:muffle-conditions sb-kernel:redefinition-warning))
当然,除了我想掩盖“undefined variable”警告,而不是重新定义


如果有人知道这是什么参数,或者有到
sb ext:muffle conditions
的文档/各种选项的链接,请分享:)谢谢我不确定您是否能够特别地消除这种类型的警告,至少是通过类名。通过跟踪
warn
,我们可以了解SBCL在做什么。例如,看看在重新定义的情况下会发生什么:

*(跟踪警告)
(警告)
*(无)
福
*(无)
0:(WARN SB-KERNEL:REDEFINITION-WITH-DEFUN:NAME FOO:NEW-FUNCTION)
#:新地点
#S(SB-C:定义-源位置
:NAMESTRING NIL
:TOPLEVEL-FORM-NUMBER NIL
:PLIST NIL)
STYLE-WARNING:在DEFUN中重新定义COMMON-LISP-USER::FOO
0:警告返回零
福
正在使用类sb kernel调用:使用defun和参数作为类指示符重新定义,因此发出的警告具有某种特定的类类型。能够基于特定的类类型进行消音使消音更容易

现在,看看在未定义变量的情况下会发生什么:

*(defun foo2()x)
0:(警告“未定义”(~A~):~S):变量X)
; in:DEFUN FOO2
;     (2 X块)
; 
; 捕获警告:
;   未定义变量:X
0:警告返回零
; 
; 编译单元已完成
;   未定义变量:
;     X
;   捕获1个警告条件
食物2
warn
是用一个格式字符串和一些参数调用的,因此发出的警告只是一个字符串。现在,你仍然可以做一些事情来掩盖它,但它有点复杂

根据SBCL手册部分,
sb ext:muffle conditions
仅使用重启。因为未定义变量警告只是一个
简单警告
,我们可能不想掩盖所有
简单警告
,所以我们需要有点偷偷摸摸,使用处理程序绑定指定的处理程序检查条件。因为我们已经看到了调用
warn
的参数,所以我们可以非常具体地了解捕获的内容。我们可以通过
未定义的-variable-warning-p
识别这些警告:

(定义未定义-变量-警告-p(w)
(let((控件(简单条件格式控件w))
(参数(简单条件格式参数w)))
(和(=2(长度参数))
(等式:变量(第一个参数))
(字符串=控件“未定义(~A~):~S”))
现在,我们可以将编译表单包装在适当的
处理程序绑定中。例如,让我们看看
(compile nil(lambda()x))
(带和不带处理程序):

CL-USER>(编译nil'(lambda()x))
; 
; 捕获警告:
;   未定义变量:X
; 
; 编译单元已完成
;   未定义变量:
;     X
;   捕获1个警告条件
#
T
T
CL-USER>(处理程序绑定)
((简单警告)
#"(lambda(w)
(当(未定义-变量-警告-p w)
(调用重新启动“马弗警告”(muffle warning)()))
(编译nil'(lambda()x)))
#
无
无
我们已经成功地编译了函数并禁用了未定义变量警告。但是,请注意,您不能简单地在这里包装
defun
s。例如:

CL-USER>(处理程序绑定)
((简单警告)
#"(lambda(w)
(当(未定义-变量-警告-p w)
(调用重新启动“马弗警告”(muffle warning)()))
(定义某个函数()x))
; in:定义某些函数
;     (DEFUN SOME-FUNCTION()X)
; --> PROGN EVAL-WHEN SB-IMPL::%DEFUN SB-INT:NAMED-LAMBDA函数
; ==>
;   (方框A-X功能)
; 
; 捕获警告:
;   未定义变量:X
; 
; 编译单元已完成
;   未定义变量:
;     X
;   捕获1个警告条件
多功能
但是,如果您
eval
使用相同的
defun
(但我不是说您应该这样做),则警告将被隐藏:

CL-USER>(处理程序绑定)
((简单警告)
#"(lambda(w)
(当(未定义-变量-警告-p w)
(调用重新启动“马弗警告”(muffle warning)()))
(eval'(defun其他函数()x)))
其他功能
我不确定这到底是为什么,但我希望有人能在评论中详细说明。我怀疑这来自REPL上的SBCL编译表单,这意味着
defun
的主体是在整个表单运行之前编译的,因此编译是在处理程序就位之前进行的