Debugging 如何在lisp(sbcl)中禁用警告
如何禁用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
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”
(defmacro sq2(变量值)
(让
((值到设定值))
`(项目
(defvar,var)
(setq、var、要设置的值)))
(sq2 v(主“hi”))
- 副作用:打印
hi
- 返回值:
“hi”
值来设置,
但您可以再次使用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手册,节点“包装锁”
所以…当有疑问的时候,避免你