我正在尝试使用 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
.