Lisp CLOS:如何使插槽具有强制类型的符号向量?

Lisp CLOS:如何使插槽具有强制类型的符号向量?,lisp,common-lisp,sbcl,clos,Lisp,Common Lisp,Sbcl,Clos,我试图创建一个类,它可以在SBCL的插槽中存储符号向量。我不知道如何设置它 到目前为止,我最好的猜测是 (defclass Individual () ((discrete-decisions :type (vector symbol)))) 这将返回以下错误: keyword argument not a symbol: (DISCRETE-DECISIONS :TYPE (VECTOR SYMBOL)). [Condition of type SB-INT:SIMPLE-PROG

我试图创建一个类,它可以在SBCL的插槽中存储符号向量。我不知道如何设置它

到目前为止,我最好的猜测是

(defclass Individual ()
  ((discrete-decisions :type (vector symbol))))
这将返回以下错误:

keyword argument not a symbol:
(DISCRETE-DECISIONS :TYPE (VECTOR SYMBOL)).
   [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]
一些实验表明,将类型更改为仅
symbol
会返回相同的错误。我认为
symbol
是Common Lisp中的一个有效类型。。。我弄错了吗

我怎样才能让它工作

[编辑]


我遇到的上述问题是在2012年9月22日Emacs 24.2下的Slime构建中运行SBCL 1.0.58。当我从命令行运行SBCL 1.0.58时,没有问题。这看起来不像是SBCL问题…

我知道我可能太晚了,但您应该围绕您的classe声明进行安全优化。例如:

(locally (declare (optimize safety))
    (defclass test-class ()
      ((some-slot :type real :initarg :some-slot :accessor :test-some-slot))))

您可以考虑在Access访问器/写入器上定义A:方法之后。另外,通过定义您自己的元类和使用类自定义插槽值,可以实现最终的控制级别。顺便说一句,在默认安全设置中,SBCL不会检查插槽类型。我在Windows 7上使用SBCL 1.0.58。这可能是一个bug吗?可能是,您应该查阅sbcl邮件列表。该列表表示在插槽中存储另一种类型的值的效果尚未定义。因此,期望检查类型是不可移植的。另一种方法是保留未指定的类型,并使用.Or use:before测试您自己。例如,对于具有插槽基因组的类单元格,我们可以确保基因组插槽中对象的类型与类定义中指定的类型匹配:

(defmethod(setf cell genome):before(new value(object cell))(let((sd genome(cell genome的插槽定义)))(assert(typep new value)(sb mop:slot definition type sd genome‘‘‘‘))