0

我正在尝试使用 ClozureCL 学习 CL,并且正在使用Google 的 Lisp koans

剧透警告:我正在给出一个答案来构建我的问题,因为如果我不这样做,提交的答案可能不会有针对性。


此处的代码显示了x通过的值。

(define-test test-guess-that-type!
  (let ((x '(SIMPLE-ARRAY ARRAY (5 3 *))))
    (assert-true (subtypep x '(SIMPLE-ARRAY T (* 3 *))))
    (assert-true (subtypep x '(SIMPLE-ARRAY T (5 * *))))
    (assert-true (subtypep x '(SIMPLE-ARRAY ARRAY *)))
    (assert-true (typep (make-array '(5 3 9) :element-type 'STRING ) x))
    (assert-true (typep (make-array '(5 3 33) :element-type 'VECTOR ) x))))

尽管超出了类型符号中使用的模式,但我觉得我学到的东西不多。我想看看我是否可以使用x表单中的值通过测试,(type-of ...)以便我可以通过示例将实际值与类型联系起来。

也就是说,这是我目前未受过教育的猜测。我标记的断言; <!>对于我的第一个选择值失败x

(define-test test-guess-that-type!
  (let ((x (type-of (make-array '(5 3 33) :element-type 'VECTOR))))
    (assert-true (subtypep x '(SIMPLE-ARRAY T (* 3 *))))
    (assert-true (subtypep x '(SIMPLE-ARRAY T (5 * *))))
    (assert-true (subtypep x '(SIMPLE-ARRAY ARRAY *)))
    (assert-true (typep (make-array '(5 3 9) :element-type 'STRING ) x)) ; <!>
    (assert-true (typep (make-array '(5 3 33) :element-type 'VECTOR ) x))))

我的问题是:如果被限制使用解决公案的(type-of <val>)<val>方法?

迄今为止的观察:

  • 这里,(type-of x)is (SIMPLE-ARRAY T (5 3 33)),这显然不是我想要的。我想要(SIMPLE-ARRAY ARRAY (5 3 *))矢量元素。
  • 看来我只能使用fixnum值指定维度,并且设置:adjustable t使数组“明确可调”,这显然意味着数组不再是SIMPLE-ARRAY.
4

2 回答 2

4

我认为没有解决方案。实际上,您可能会在某些 CL 实现中找到解决方案,但不能保证。的规范TYPE-OF没有详细说明在大多数情况下返回的类型说明符,只是要求

(typep object (type-of object))

必须是真实的,以及其他一些限制。但是没有什么特定于数组的。

我认为任何实现都不会返回包含*在数组类型维度中的类型说明符。他们可能会返回一个非常通用的类型说明符,它完全省略了维度,或者一个非常具体的包含给定数组的实际维度的说明符。

没有什么可以阻止实现返回您正在寻找的类型说明符,但这将是非常不正当的。给定一个 3 维数组,为什么它会特别选择使最后一个维度未指定而不是其他一个或所有维度?

于 2018-05-23T19:37:56.150 回答
0

尽管超出了类型符号中使用的模式,但我觉得我学到的东西不多。

你可能已经学到了一些东西:

  • Common Lisp 具有元素类型和指定维度以及通配符维度的多维数组的类型声明。

  • 有这些类型的子类型和检查子类型关系的函数 ( SUBTYPEP)

  • 有简单数组(不移位,没有填充指针,不明确可调)和非简单数组

  • 您传递给MAKE-ARRAY的元素类型不一定是创建数组的元素类型(参见函数UPGRADED-ARRAY-ELEMENT-TYPE

*

于 2018-05-25T14:25:09.100 回答