Когда я пытаюсь создать такой массив с одним числом с плавающей запятой, я получаю:
(make-array 2 :element-type 'double-float :initial-contents #(3.0 4.0))
Вы пытаетесь создать массив single-float (что говорит ваш текст) или массив double-float (как предлагает код)? Чтобы создать массив двойных чисел с плавающей запятой, используйте (make-array :element-type 'double-float ), а для создания массива single-float, вы должны использовать (make-array :element-type 'single-float ). Однако в любом случае элементы в аргументе initial-elements должны соответствовать указанному типу; запись HyperSpec для make-array Говорит, что:
Initial-contents состоит из вложенной структуры последовательностей. Количество уровней в структуре должно равняться рангу массива. Каждый лист вложенной структуры должен иметь тип, заданный element-type.
Поскольку одинарное число с плавающей запятой и двойное число с плавающей запятой не являются одним и тем же типом, вам необходимо заранее преобразовать данные. Вы можете использовать map для создания результата или map-into, если вы хотите сначала создать его, а затем скопировать результаты. Например:
CL-USER> (map '(vector double-float *)
#'(lambda (x) (float x 1.0d0))
#(3.0 4.0))
#(3.0d0 4.0d0)
CL-USER> (map-into (make-array 2 :element-type 'double-float)
#'(lambda (x) (float x 1.0d0))
#(3.0 4.0))
#(3.0d0 4.0d0)
Those examples assume that you're trying to create an array of double-floats, which is what your code suggests. If you just want an array of single-floats, then you can just the correct type:
CL-USER> (make-array 2 :element-type 'single-float :initial-contents #(3.0 4.0))
#(3.0 4.0)
Или, как заметил Сванте, вы можете просто написать #(3.0 4.0) или #(3.0s0 4.0s0) напрямую.
person
Joshua Taylor
schedule
27.02.2015