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

Posted

技术标签:

【中文标题】CLOS:如何使插槽具有强制类型的符号向量?【英文标题】:CLOS: How to make a slot have an enforced type of vector of symbols? 【发布时间】:2012-09-15 09:50:24 【问题描述】:

我正在尝试创建一个类,该类可以将符号向量存储在 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 中的有效类型……我错了吗?

我怎样才能让它工作?

[编辑]

我遇到的上述问题是在 Emacs 24.2 下的 09-22-2012 Slime 版本中运行 SBCL 1.0.58。当我从命令行运行 SBCL 1.0.58 时,没有问题。这似乎不是 SBCL 问题...

【问题讨论】:

顺便说一句,在默认安全设置中,SBCL 不会检查插槽类型 我在 Windows 7 上使用 SBCL 1.0.58。这可能是一个错误吗? 可能是,您应该查阅 sbcl 邮件列表 spec 表示在槽中存储另一种类型的值的效果是未定义的。因此,期望检查类型不是“可移植的”。另一种方法是不指定类型并使用check-type 测试自己。 【参考方案1】:

我知道我可能为时已晚,但您应该围绕类声明进行安全优化。例如:

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

【讨论】:

【参考方案2】:

您可以考虑在插槽访问器/写入器上定义一个 :after 方法。此外,可以通过定义自己的元类和自定义 slot-value-using-class 来实现最终程度的控制

【讨论】:

或使用 :before。例如,对于具有槽基因组的类细胞,我们可以确保基因组槽中的对象类型与类定义中指定的类型匹配:(defmethod (setf cell-genome) :before (new-value (object cell)) (let ((sd-genome (slot-definition-for-cell-genome))) (assert (typep new-value (sb-mop:slot-definition-type sd-genome)))))

以上是关于CLOS:如何使插槽具有强制类型的符号向量?的主要内容,如果未能解决你的问题,请参考以下文章

SV强制类型转换和常数

使用 __builtin_msa_ld_* 后如何转换为无符号向量类型

请问向量的符号用LATEX怎么打呢?就是字母上面带个箭头的

为啥用 Eigen 和 OpenCV 计算的 SVD 左奇异向量具有不同的符号

XGBoost 自定义评估函数导致“无法强制类型闭包到类型向量”

根据用户输入更改箱线图显示 - 闪亮(不能强制类型“闭包”为字符类型的向量)