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

Debugging 如何在lisp(sbcl)中禁用警告,debugging,lisp,common-lisp,sbcl,Debugging,Lisp,Common Lisp,Sbcl,如何禁用sbcl中的所有警告?额外的输出非常烦人。您可能需要查看。您可以使用SB-EXT:MUFFLE-CONDITIONS正如Pillsy所说,另一种方法是通读警告并使用它们修改代码以删除警告。特别是如果它们实际上是警告(而不是优化注释)。这是我用来掩盖编译时和运行时(加载时)重新定义警告的: (locally (declare #+sbcl(sb-ext:muffle-conditions sb-kernel:redefinition-warning)) (handler-bin

如何禁用sbcl中的所有警告?额外的输出非常烦人。

您可能需要查看。

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

这是我用来掩盖编译时和运行时(加载时)重新定义警告的:

(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:MAFFLE-CONDITIONS为非常恼人的未定义变量警告工作,即使在谷歌搜索了很多次。在REPL上进行实验时,这个警告让我发疯,所以我做了所有书籍建议我们应该做的事情:扩展lisp以满足我的需要/偏好

我编写了自己的setq,关闭了sbcl警告,这是我有史以来的第一个宏:)。我相信有更好的方法可以做到这一点,但这对我来说非常有用,而且它正进入我的~/.sbclrc

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

在对
以及苦读那些显然对简单的具体例子过敏的人编写的文档
(这似乎是大多数事情的大多数文档)
我认为您需要做的就是禁用所有警告
是否在
.sbclrc
文件中添加此行:

(声明(sb分机:马弗条件cl:警告))
要仅禁用样式警告,请执行以下操作:

(声明(sb分机:马弗条件cl:样式警告))
我试图特别禁用当您在新的REPL中输入eg
(setq x 1)
时出现的警告

;in:setqx
;     (SETQ X 1)
; 
; 捕获警告:
;   未定义变量:X
; 
; 编译单元已完成
;   未定义变量:
;     X
;   捕获1个警告条件
通过使用以下命令:

(声明(sb外部:马弗条件sb内核:重新定义警告))
但它不起作用,
(显然,
重新定义警告
意味着其他东西)
我找不到它应该是什么。
我猜是sb内核:未定义的警告 但这并不存在

使用宏 而且,
关于@Bogatyr的回答
(使用宏自动运行
defvar

和@spacebat的评论
(宏对该值求值两次)
我要说:

当另一个新手遇到这个问题时,
我想做一个演示,显示宏求值两次,
并显示仅计算一次的版本


我最初是在问题的末尾编辑的
但由于:
“此编辑旨在针对文章的作者,作为编辑毫无意义。它应该作为评论或回答来撰写。”

嗯,你不能回答任何问题,
但是注释不能包含代码块,
所以我想我应该把它放在这里 )

起初的
(defmacro sq(var值)
`(项目
(defvar、var、value)
(setq、var、value)
(sq v(主“hi”))
  • 副作用:打印
    hihi
  • 返回值:
    “hi”
重写2-仅评估一次,始终运行defvar
(defmacro sq2(变量值)
(让
((值到设定值))
`(项目
(defvar,var)
(setq、var、要设置的值)))
(sq2 v(主“hi”))
  • 副作用:打印
    hi
  • 返回值:
    “hi”
重写3-同上,但阅读起来更难 为了清晰起见,我使用了
值来设置

但您可以再次使用
value
,而不会出现任何问题:

(defmacro sq3(变量值)
(让
((价值))
`(项目
(defvar,var)
(setq、var、value)
(sq3 v(主“hi”))
重写4-仅在变量未绑定时运行defvar 运行这些宏将始终在设置变量之前定义它,
因此,如果
v
已经“绑定”但没有“定义”
(即您是用
setq
引入它的)
使用变量时,将不会再收到任何错误消息,
或者使用
setq
重置它

这是宏的一个版本
仅当变量尚未绑定时才运行
defvar

(defmacro sq4(变量值)
(让
((值到设定值))
(如果(边界变量)
`(setq、var、要设置的值)
`(项目
(defvar,var)
(setq,var,要设置的值‘‘‘‘‘)
(sq4 v(主“hi”))
因此,如果您使用它来设置一个已绑定但未定义的变量
它将不断向您发送错误消息。
(哪一个可能是件好事?
比如,出于同样的原因——我不知道为什么会出现错误消息。)

[
而且,
我在这些设备上测试了宏:

(sq4值1)
(sq4值’值)
(要设置的sq4值)
(sq4值'var)
(sq4值设置为1)
(sq4值设置为“值”)
(要设置的sq4值“要设置的值”)
(用于设置“var”的sq4值)
(sq4变量1)
(sq4变量值)
(要设置的sq4变量值)
(sq4变量'var)
(你知道,检查我没有搞砸……做了什么奇怪的事。)

我试图使用
var
作为变量的那些变量会产生错误

起初我以为我把事情搞砸了,
但它实际上只是为SBCL(?)本身的一些特殊东西保留的

(defvar)
获取:

;在线程中的SYMBOL-PACKAGE-LOCKED-ERROR上调用调试器
; #:
;全局声明VAR SPECIAL while时违反了包SB-DEBUG上的锁定
;封装中的COMMON-LISP-USER。
;另见:
;SBCL手册,节点“包装锁”
所以…当有疑问的时候,避免你