gpt4 book ai didi

common-lisp - sbcl - 如何消除 "undefined variable"警告?

转载 作者:行者123 更新时间:2023-12-04 02:43:33 29 4
gpt4 key购买 nike

我不知道如何使用 sb-ext:muffle-conditions .我想做这样的事情:

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

当然,除了我想消除“ undefined variable ”警告而不是重新定义。

如果有人知道这是什么参数,或者有 sb-ext:muffle-conditions 的文档/各种选项的链接,请分享:)谢谢

最佳答案

我不确定您是否能够专门消除这种类型的警告,至少通过类名。通过追踪 warn ,我们可以了解 SBCL 在做什么。例如,看看在重新定义的情况下会发生什么:

* (trace warn)

(WARN)
* (defun foo () nil)

FOO
* (defun foo () nil)
0: (WARN SB-KERNEL:REDEFINITION-WITH-DEFUN :NAME FOO :NEW-FUNCTION
#<FUNCTION FOO {10041FA989}> :NEW-LOCATION
#S(SB-C:DEFINITION-SOURCE-LOCATION
:NAMESTRING NIL
:TOPLEVEL-FORM-NUMBER NIL
:PLIST NIL))
STYLE-WARNING: redefining COMMON-LISP-USER::FOO in DEFUN
0: WARN returned NIL
FOO

warn 被类 sb-kernel:redefinition-with-defun 调用和参数作为类指示符,因此发出的警告具有某种特定的类类型。能够基于特定的类类型进行消音使消音更容易。

现在,看看在 undefined variable 的情况下会发生什么:

* (defun foo2 () x)
0: (WARN "undefined ~(~A~): ~S" :VARIABLE X)

; in: DEFUN FOO2
; (BLOCK FOO2 X)
;
; caught WARNING:
; undefined variable: X
0: WARN returned NIL
;
; compilation unit finished
; Undefined variable:
; X
; caught 1 WARNING condition
FOO2
warn正在使用格式字符串和一些参数调用,因此发出的警告只是 simple-warning .现在,你仍然可以做一些事情来消音它,但它有点复杂。

根据 SBCL 手册部分, 3.1.1 Controlling Verbosity , sb-ext:muffle-conditions只是使用 muffle-warning 重新开始。因为 undefined variable 警告只是一个 simple-warning ,我们可能不想把所有 simple-warning s,我们需要偷偷摸摸地使用 handler bind 指定的处理程序检查条件。因为我们已经看到了 warn 的论点。被调用,我们可以非常具体地捕捉到什么。我们可以通过 undefined-variable-warning-p 识别这些警告。 :

(defun undefined-variable-warning-p (w)
(let ((control (simple-condition-format-control w))
(arguments (simple-condition-format-arguments w)))
(and (= 2 (length arguments))
(eq :variable (first arguments))
(string= control "undefined ~(~A~): ~S"))))

现在我们可以将编译表格包装在适当的 handler-bind 中。 .例如,让我们看看 (compile nil (lambda () x))有和没有处理程序:

CL-USER> (compile nil '(lambda () x))
;
; caught WARNING:
; undefined variable: X
;
; compilation unit finished
; Undefined variable:
; X
; caught 1 WARNING condition
#<FUNCTION (LAMBDA ()) {1003AA4F89}>
T
T

CL-USER> (handler-bind
((simple-warning
#'(lambda (w)
(when (undefined-variable-warning-p w)
(invoke-restart 'muffle-warning)))))
(compile nil '(lambda () x)))
#<FUNCTION (LAMBDA ()) {1003B737E9}>
NIL
NIL

我们已经成功地编译了函数并将 undefined variable 警告静音。但是,请注意,您不能简单地包装 defun s 在这。例如。,

CL-USER> (handler-bind
((simple-warning
#'(lambda (w)
(when (undefined-variable-warning-p w)
(invoke-restart 'muffle-warning)))))
(defun some-function () x))

; in: DEFUN SOME-FUNCTION
; (DEFUN SOME-FUNCTION () X)
; --> PROGN EVAL-WHEN SB-IMPL::%DEFUN SB-INT:NAMED-LAMBDA FUNCTION
; ==>
; (BLOCK SOME-FUNCTION X)
;
; caught WARNING:
; undefined variable: X
;
; compilation unit finished
; Undefined variable:
; X
; caught 1 WARNING condition
SOME-FUNCTION

但是,如果您 eval一样的 defun (但我并不是说你应该这样做),警告被掩盖了:

CL-USER> (handler-bind
((simple-warning
#'(lambda (w)
(when (undefined-variable-warning-p w)
(invoke-restart 'muffle-warning)))))
(eval '(defun some-other-function () x)))
SOME-OTHER-FUNCTION

我不确定这是为什么,但我希望有人能够在评论中详细说明。我怀疑这来自 SBCL 编译 REPL 上的表格,这意味着 defun 的正文在整个表单运行之前进行编译,因此编译是在处理程序到位之前进行的。

关于common-lisp - sbcl - 如何消除 "undefined variable"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18155373/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com