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

Ste*_*all 16 lisp debugging sbcl common-lisp

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

Vat*_*ine 10

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


Att*_*vai 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
    ))
Run Code Online (Sandbox Code Playgroud)

按照这种模式,您可以在超类上安装这些处理​​程序,例如cl:style-warning,以消除所有样式警告.


Owe*_*n_R 7

在花了很多时间看完
那些显然对简单的具体示例过敏的人编写的文档
(似乎是大多数情况下的大多数文档)之后,
我想禁用所有警告所需要做的
就是在.sbclrc文件中添加以下行:

(declaim (sb-ext:muffle-conditions cl:warning))
Run Code Online (Sandbox Code Playgroud)

要仅禁用样式警告,它是:

(declaim (sb-ext:muffle-conditions cl:style-warning))
Run Code Online (Sandbox Code Playgroud)

我试图专门禁用如果您输入例如(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
Run Code Online (Sandbox Code Playgroud)

通过使用此:

(declaim (sb-ext:muffle-conditions sb-kernel:redefinition-warning))
Run Code Online (Sandbox Code Playgroud)

但它不起作用
((显然redefinition-warning意味着别的东西))
,我找不到应有的样子。
我猜到了,sb-kernel:undefined-warning
但是那不存在。

使用宏

另外,
关于@Bogatyr的答案
(使用宏来自动运行defvar
和@spacebat的注释
(该宏对值进行两次评估),
我要说的是:

作为另一个遇到的问题,
我想进行演示以演示该宏两次
评估,并演示仅评估一次的版本。


我最初是在问题的末尾进行编辑的,
但由于以下原因而被拒绝:
“此编辑旨在针对帖子的作者,并且没有任何意义。应将其写为评论或答案。 ”

好吧,您不能回答问题,
但是注释不能占用代码块,
所以我想我应该把它放在这里吗?

原版的

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

    (sq v (princ "hi"))
Run Code Online (Sandbox Code Playgroud)
  • 副作用:版画 hihi
  • 返回值: "hi"

重写2-仅评估一次,始终运行defvar

(defmacro sq2 (var value)
 (let
   ((value-to-set value))
   `(progn
      (defvar ,var)
      (setq ,var ,value-to-set))))

    (sq2 v (princ "hi"))
Run Code Online (Sandbox Code Playgroud)
  • 副作用:版画 hi
  • 返回值: "hi"

重写3-与上面相同,但阅读起来比较棘手

我 只是value-to-set为了清楚起见,
但您可以毫无问题地value再次使用它:

(defmacro sq3 (var value)
 (let
   ((value value))
   `(progn
      (defvar ,var)
      (setq ,var ,value))))

    (sq3 v (princ "hi"))
Run Code Online (Sandbox Code Playgroud)

重写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"))
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用它来设置一个已绑定但未定义的变量,
它将不断显示错误消息。
(这也许是一件好事?例如
,出于同样的原因-我实际上并不知道-为什么错误消息首先存在。)

[
另外,
我在这些宏上进行了测试:

(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            )
Run Code Online (Sandbox Code Playgroud)

(您知道,检查我没有搞砸,...做了一些奇怪的事情。)

我尝试将其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"
Run Code Online (Sandbox Code Playgroud)

所以... var我想,如果有疑问,请避免使用符号。
]