这就是我用来消除编译时和运行时(加载时)重定义警告的方法:
(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,以消除所有样式警告.
在花了很多时间看完
那些显然对简单的具体示例过敏的人编写的文档
(似乎是大多数情况下的大多数文档)之后,
我想禁用所有警告所需要做的
就是在.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"(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"我
只是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)
运行这些宏将始终在设置变量之前对其进行定义,
因此,如果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我想,如果有疑问,请避免使用符号。
]
| 归档时间: |
|
| 查看次数: |
4176 次 |
| 最近记录: |