← Архив: Common Lisp

:initial-element в make-array вычисляется только раз?!

Author: · 18.10.2011 14:33
· original author: Menschenkindlein
Почему форма, которая передается как :initial-element выполняется только раз? В CLHS ведь ясно написано:
If initial-element is supplied, it is used to initialize each (!!!) element of new-array.
· original author: allchemist
Ну да, она один раз вычисляется, и результат записывается в каждую ячейку. Чтобы не делать лишней работы
· original author: bach74
а почему должно быть иначе? пишите цикл, если Вы хотите каждый элемент массива инициализировать разными объектами. Через loop, например. Есть еще функционалы типа map и т.д.
· original author: Menschenkindlein
А вот почему бы не добавить :initial-form, как в слотах обьектов?
Было бы красивее, а так нужно дополнительную форму писать.
· original author: Menschenkindlein
Кстати, а как сделать map на многомерный array?
· original author: Love5an
(defun array-view (array)
  (declare (type array array))
  (make-array (array-total-size array)
    :element-type (array-element-type array)
    :displaced-to array
)
)

(let ((array (make-array '(2 2) :initial-contents '((1 2) (3 4)))))
 (let ((view (array-view array)))
   (map-into view #'1+ view)
   (print array)
)
)

;; => #2A((2 3) (4 5))
· original author: bach74
Я как-то не особо функции высокого порядка жалую (хотя  в коде по раскрытию макроса можно использовать без проблем, конечно), поскольку в CL много и других выразительных средств.
· original author: LinkFly
Можно делать отображения на многомерные массивы?! Круто!