【发布时间】:2017-08-07 15:50:25
【问题描述】:
考虑这个简单的例子:
(deftype image nil '(simple-array single-float (100)))
这里我们定义了一个类型的简写,它是一个包含单个浮点数的数组。让我们尝试创建一个这样的:
(defparameter tmp
(make-array 100
:element-type 'single-float
:initial-element 0.0))
让我们检查一下类型以防万一:
CL-USER> (type-of tmp)
(SIMPLE-ARRAY SINGLE-FLOAT (100))
一切都好。让我们看看我们是否可以将这些小数组放在另一个数组中,以使检索更容易,而不是将所有内容都放入一维数组中并最终计算访问索引时很头疼。
(defparameter image-array
(make-array 10
:element-type 'image
:initial-element tmp))
除了检查以防万一之外,它没有办法失败:
CL-USER> (type-of image-array)
(SIMPLE-VECTOR 10)
糟糕,这根本不是我们想要的。似乎这个新数组默认为默认元素类型:
CL-USER> (array-element-type image-array)
T
这可能意味着应用程序现在不仅要检查容器数组元素,还要检查子数组的元素,从而影响性能。出现的问题是这样的:
在 SBCL 中是否可以将类型化数组作为数组元素存储在另一个数组中?
编辑:虽然这会返回正确的类型,但恐慌可能还为时过早:
CL-USER> (type-of (aref image-array 0))
(SIMPLE-ARRAY SINGLE-FLOAT (100))
在这种情况下,为什么我们从(array-element-type image-array) 得到T 作为元素类型?
【问题讨论】:
-
根据下面的讨论,简而言之,SBCL 将外部数组的元素报告为
T,因为内部数组是引用类型。似乎它只将原始类型报告为数组元素,而引用类型升级为T。内部数组的类型将被正确报告。 -
你应该看看
upgraded-array-element-type。
标签: arrays multidimensional-array lisp common-lisp sbcl