在 Common Lisp 中我可以检查如下类型:
(typep #(1 2 3) 'sequence)
;; returns T
所以我可以在
sequence
中使用 (declaim (ftype ...
来指定函数的参数。
是否可以使类型更加具体,并强制参数为
vector
中的 fixnum
?
示例:
(declaim (ftype (function (fixnum) sequence) abc))
(defun abc (n) #(n))
该函数及其类型定义按预期工作。但是我可以更具体地定义返回类型吗?而不是
sequence
之类的东西?(vector fixnum)
或者,更一般地,使用
(coerce #(1 2 3) '(vector fixnum))
来指定类型:
make-array
请注意,数组中的元素类型是 Lisp 和实现平台之间主要使用的信息,以可能
使用更紧凑、更高效等的专用数组类型,而不是必然限制哪种类型的类型您可以放入其中的价值。 例如向量如下:
(make-array 3 :element-type 'fixnum :initial-contents '(1 2 3))
SBCL 中描述的具有以下类型:
(make-array 10 :element-type '(member 1 2 3))
但是用零初始化:
Element type: (UNSIGNED-BYTE 2)
但是零不是声明类型的值。
这一切都归结为数组的升级元素类型是什么,这是可以适合专用数组的值的类型。