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:如何使插槽具有强制类型的符号向量?的主要内容,如果未能解决你的问题,请参考以下文章
使用 __builtin_msa_ld_* 后如何转换为无符号向量类型
为啥用 Eigen 和 OpenCV 计算的 SVD 左奇异向量具有不同的符号