Я пытаюсь изучить CL, используя ClozureCL, и я нахожусь в середине Lisp koans от Google .
Предупреждение спойлера : я даю ответ насформулируйте мой вопрос, потому что если я не сделаю этого, представленные ответы могут быть не такими целевыми.
Код здесь показывает значение 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>)
what <val>
решает коан ?
Наблюдения на данный момент:
- Здесь
(type-of x)
- это (SIMPLE-ARRAY T (5 3 33))
, что явно не то, что я хочу.Я хочу (SIMPLE-ARRAY ARRAY (5 3 *))
с векторными элементами. - Похоже, я могу указывать только измерения, используя значения
fixnum
, а установка :adjustable t
делает массив «явно настраиваемым», что, очевидно, означает, что массив больше не являетсяSIMPLE-ARRAY
.