【发布时间】:2021-12-27 19:49:07
【问题描述】:
我刚刚阅读了 CL 中的类型,我发现了以下行为,例如关于vector类型的附属类型信息有点令人费解:
(let ((v1 (vector 1 3))
(v2 (vector 1 3 4))
(v3 (vector 1 3 "4")))
(values
(typep v1 '(vector (satisfies oddp)))
(typep v2 '(vector (satisfies oddp)))
(typep v3 '(vector (satisfies oddp)))))
根据spec,向量复合类型的第一个参数表示元素类型,因此上面的类型说明符应该匹配一个向量与满足oddp的元素,对吧?那么为什么所有类型检查都t呢?!?! @_@
这个问题的解决办法是
(defun vector-of-oddints-p (v)
(and
(vectorp v)
(every #'(lambda (n) (and (integerp n) (oddp n))) v)))
(let ((v1 (vector 1 3))
(v2 (vector 1 3 4))
(v3 (vector 1 3 "4")))
(values
(typep v1 '(satisfies vector-of-oddints-p))
(typep v2 '(satisfies vector-of-oddints-p))
(typep v3 '(satisfies vector-of-oddints-p))))
但这感觉很笨拙,上面的类型说明符应该可以工作。
【问题讨论】:
-
在向量上调用TYPE-OF,看看它返回什么。
-
@Rainer Joswig 它按预期返回简单向量(向量的子类型)。不知道这意味着什么。
标签: types common-lisp