fixnums 的 Common Lisp 类型向量

问题描述 投票:0回答:1

在 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
之类的东西?
    

types lisp common-lisp
1个回答
0
投票

(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)

但是零不是声明类型的值。

这一切都归结为数组的升级元素类型是什么,这是可以适合专用数组的值的类型。

© www.soinside.com 2019 - 2024. All rights reserved.