【发布时间】:2018-02-04 08:24:37
【问题描述】:
我有两个包,每个包都定义了一个类。第二个类继承自第一个类,但有一个同名的插槽。其意图确实是覆盖插槽。
(defpackage :foo
(:use :cl)
(:export foo))
(in-package :foo)
(defclass foo () ((s)))
(defpackage :bar
(:use :cl :foo)
(:export bar))
(in-package :bar)
(defclass bar (foo) ((s)))
当我创建bar 的实例时,sbcl 会给出一个有用的警告
(make-instance 'bar)
STYLE-WARNING:
slot names with the same SYMBOL-NAME but different SYMBOL-PACKAGE (possible
package problem) for class #<STANDARD-CLASS BAR:BAR>:
(FOO::S BAR::S)
由于这是预期的行为,我可以像这样抑制该警告:
(handler-bind (#+SBCL (style-warning #'muffle-warning))
(make-instance 'bar))
但是,我希望 bar 类的用户能够在不收到警告的情况下创建实例。
我可以编写一个包含前一个代码块中代码的包装函数,但是否可以在调用 (make-instance 'bar) 之前抑制警告而不消除所有样式警告?
【问题讨论】:
-
如果您打算覆盖该插槽,则必须从其他包导入名称(或使用包限定名称)。照原样,您有两个插槽,
FOO::S和BAR::S。 -
@jkiiski Doh!很好,谢谢。
-
这正是警告的内容;-)
-
请给出答案。
标签: common-lisp warnings sbcl clos suppress