如何在Common Lisp中指定Fixnum类型的Vector作为函数类型?
Common Lisp 函数类型精确限定问题解答
完全可以用(vector fixnum)替代sequence,以此更精确地限定函数的返回类型为仅包含Fixnum元素的向量。
注意原代码的问题
原示例中的#(n)是字面量向量语法,其中的n会被解析为符号而非变量n的值,因此实际返回的是包含符号的向量,并不符合(vector fixnum)的类型要求,需要调整向量的构造方式。
修正后的代码示例
;; 精确声明函数参数为fixnum,返回值为fixnum类型的向量 (declaim (ftype (function (fixnum) (vector fixnum)) abc)) (defun abc (n) ;; 用vector函数构造包含变量n值的向量 (vector n) ;; 若要强制向量的元素类型为fixnum,也可以用make-array明确指定 ; (make-array 1 :element-type 'fixnum :initial-element n) )
验证类型正确性
可以通过typep函数验证返回值是否符合预期类型:
(typep (abc 42) '(vector fixnum)) ;; 返回 T
进阶类型限定
如果需要更严格的约束,比如限定向量的长度,还可以使用带长度参数的类型 specifier,例如(vector fixnum 1)表示长度为1的Fixnum向量:
(declaim (ftype (function (fixnum) (vector fixnum 1)) abc))
内容的提问来源于stack exchange,提问作者christian wuensche
相关产品推荐
相关产品推荐

