Использование дефараметра - PullRequest
0 голосов
/ 10 октября 2018

Интересно, так ли это, потому что я ничего не понимаю в ядре макроса defparameter.

Итак, это дает странную ошибку.Я начинаю с:

(defparameter *x* #(1 4 7))
(defparameter *y* #(2 3 55))

Все хорошо, но потом это:

(defparameter *res* (make-array * :adjustable t :fill-pointer 0))

выдает ошибку, которую я совсем не получаю:

 The value                                                                       
 *Y*                                                                           
 is not of type                                                                  
 (OR (MOD 4611686018427387901) CONS NULL)                                      
 when binding SB-VM::DIMENSIONS
    [Condition of type TYPE-ERROR]

Ответы [ 3 ]

0 голосов
/ 10 октября 2018
CL-USER 28 > (defparameter *y* #(2 3 55))
*Y*

CL-USER 29 > *
*Y*

Значение * является первым значением последнего результата оценки верхнего уровня.

В вашем случае это значение *y* - символ.Затем вы вызываете MAKE-ARRAY с этим символом в качестве первого аргумента.MAKE-ARRAY не ожидает символа - таким образом, ошибка:

The value                                                                       
 *Y*                                                                           
 is not of type                                                                  
 (OR (MOD 4611686018427387901) CONS NULL)                                      
 when binding SB-VM::DIMENSIONS
    [Condition of type TYPE-ERROR]

Ошибка означает следующее: символ *y* не является ни числом (с определенным максимальным размером), ни списком.Помните, *y* был результатом оценки *.

0 голосов
/ 10 октября 2018

Относительно mod в сообщении об ошибке, это спецификатор типа: (mod 4611686018427387901) означает «целое число от 0 до 4611 ...», большое число - array-dimension-limit.

0 голосов
/ 10 октября 2018

* соответствует последнему оцененному значению, которое соответствует символу *Y*, который является массивом #(2 3 55).

Ноmake-array ожидает, что его первый аргумент задает «размеры» массива , который он создает:

make-array размеры и начальный элемент начального элемента типа ключевого элемента
регулируемый указатель заполнения, смещенный на смещение индекса смещения

=> новый массив

Аргументы и значения:

размеры --- обозначение для списка из допустимые размеры массива ,

... a список .

(выделено мной).Некоторые списки null с, некоторые cons с.Но не массивов символов.

И так как он ожидает список обозначение , то есть

a ненулевой атом (обозначает одноэлементный список , чей элемент означает, что ненулевой атом ) или правильный список (обозначает себя),

другая возможность - целое число.

...