如何在sbcl(或通用lisp)的向量中指定元素类型?

用户名

我尝试了sbcl 1.1.14中的以下代码,但似乎类型检查忽略了vector元素的声明。

(defun test (vec)
  (declare (type (vector integer) vec))
  (format nil "~a~&" (elt vec 0)))

有什么提示吗?谢谢!

雷纳·乔斯维格

首先请注意,将声明用作类型检查不是标准ANSI Common Lisp提供的内容。这是CMUCL引入的扩展。SBCL是CMUCL的后代。

Common Lisp类型系统用于向量和数组的方式有点不寻常。

元素类型

正在使用元素类型创建数组。这意味着Lisp系统将创建一个可以存储该类型元素的数组。但是Common Lisp并不要求每种元素类型都有专门的数组版本。如果没有专用版本的数组,则元素类型将升级为下一个“更大”的类型。

元素类型升级示例

CL-USER 14 > (upgraded-array-element-type '(unsigned-byte 1))
(UNSIGNED-BYTE 1)

CL-USER 15 > (upgraded-array-element-type '(unsigned-byte 2))
(UNSIGNED-BYTE 2)

因此,存在针对(unsigned-byte 1)优化的数组版本(unsigned-byte 2)

CL-USER 16 > (upgraded-array-element-type '(unsigned-byte 3))
(UNSIGNED-BYTE 4)

哎呀!没有针对进行优化的数组(unsigned-byte 3)如果请求这样的数组,则将得到一个稍大的数组(unsigned-byte 4)

CL-USER 17 > (upgraded-array-element-type '(unsigned-byte 4))
(UNSIGNED-BYTE 4)

CL-USER 18 > (upgraded-array-element-type '(unsigned-byte 5))
(UNSIGNED-BYTE 8)

CL-USER 19 > (upgraded-array-element-type 'integer)
T

上面显示没有针对整数的特殊数组。您将获得一个通用数组。

您的密码

(defun test (vec)
  (declare (type (vector integer) vec))
  (format nil "~a~&" (elt vec 0)))

因此,您在这里的声明确实意味着:

变量vec绑定到可以保存integer数字的向量

这并不意味着:

变量vec绑定到仅包含integer数字的向量

CL-USER 21 > (typep '#(a "b" #\c) '(vector integer))
T

上面的代码在我的Lisp中返回true,因为向量是通用向量,并且可以存储整数。因此,它检查向量的类型,但是并不关心向量的内容是否实际上全部是整数类型。只是说,向量可以包含整数。

基于谓词的类型检查

Common Lisp允许类型声明使用谓词。

CL-USER 28 > (defun vector-of-numbers-p (vector)
               (and (typep vector 'vector)
                    (every 'integerp vector)))
VECTOR-OF-NUMBERS-P

CL-USER 29 > (typep '#(a "b" #\c) '(satisfies arrayp))
T

CL-USER 30 > (typep '#(a "b" #\c) '(satisfies vector-of-numbers-p))
NIL

CL-USER 31 > (typep '#(1 2 3) '(satisfies vector-of-numbers-p))
T

但是在编译时检查一下吗?可能不是。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在sbcl(或通用lisp)的向量中指定元素类型?

来自分类Dev

如何在通用Lisp(SBCL)中执行execve()?

来自分类Dev

如何在通用Lisp(SBCL)中执行execve()?

来自分类Dev

如何在通用表模板内的Blazor WebAssembly中的Virtualize Component中指定TItem的类型

来自分类Dev

如何在CSV中指定关系类型?

来自分类Dev

如何在CSV中指定关系类型?

来自分类Dev

如何在字典中指定键值对的类型

来自分类Dev

如何在PHP中指定类型?

来自分类Dev

如何在XSD中指定重复的元素

来自分类Dev

如何在序列中指定“任何元素”

来自分类Dev

如何在序列中指定“任何元素”

来自分类Dev

如何在列表中指定元素名称?

来自分类Dev

如何在xaml元素中指定null(例如,传递给可为null的类型的集合时)

来自分类Dev

如何在C#泛型中指定可从字符串构造的T?(通用类型约束)

来自分类Dev

如何在Django Command中指定Array类型的参数?

来自分类Dev

如何在TypeScript中指定类型化的对象文字?

来自分类Dev

如何在for-in循环中指定类型?

来自分类Dev

如何在GADT制定的AST中指定异构集合的类型?

来自分类Dev

如何在app.config中指定类的类型?

来自分类Dev

如何在关联类型中指定生命周期参数?

来自分类Dev

如何在keyof声明中指定值的类型?

来自分类Dev

如何在map函数中指定数据类型?

来自分类Dev

如何在打字稿中指定以下类型?

来自分类Dev

如何在打字稿中指定枚举的索引类型

来自分类Dev

如何在TypeScript中指定类型化的对象文字?

来自分类Dev

如何在此COMMON语句中指定类型?

来自分类Dev

如何在Netsuite中指定事务搜索的特定记录类型...

来自分类Dev

如何在Rust中指定Some参数的类型?

来自分类Dev

如何在php中指定两种类型?

Related 相关文章

  1. 1

    如何在sbcl(或通用lisp)的向量中指定元素类型?

  2. 2

    如何在通用Lisp(SBCL)中执行execve()?

  3. 3

    如何在通用Lisp(SBCL)中执行execve()?

  4. 4

    如何在通用表模板内的Blazor WebAssembly中的Virtualize Component中指定TItem的类型

  5. 5

    如何在CSV中指定关系类型?

  6. 6

    如何在CSV中指定关系类型?

  7. 7

    如何在字典中指定键值对的类型

  8. 8

    如何在PHP中指定类型?

  9. 9

    如何在XSD中指定重复的元素

  10. 10

    如何在序列中指定“任何元素”

  11. 11

    如何在序列中指定“任何元素”

  12. 12

    如何在列表中指定元素名称?

  13. 13

    如何在xaml元素中指定null(例如,传递给可为null的类型的集合时)

  14. 14

    如何在C#泛型中指定可从字符串构造的T?(通用类型约束)

  15. 15

    如何在Django Command中指定Array类型的参数?

  16. 16

    如何在TypeScript中指定类型化的对象文字?

  17. 17

    如何在for-in循环中指定类型?

  18. 18

    如何在GADT制定的AST中指定异构集合的类型?

  19. 19

    如何在app.config中指定类的类型?

  20. 20

    如何在关联类型中指定生命周期参数?

  21. 21

    如何在keyof声明中指定值的类型?

  22. 22

    如何在map函数中指定数据类型?

  23. 23

    如何在打字稿中指定以下类型?

  24. 24

    如何在打字稿中指定枚举的索引类型

  25. 25

    如何在TypeScript中指定类型化的对象文字?

  26. 26

    如何在此COMMON语句中指定类型?

  27. 27

    如何在Netsuite中指定事务搜索的特定记录类型...

  28. 28

    如何在Rust中指定Some参数的类型?

  29. 29

    如何在php中指定两种类型?

热门标签

归档