2014年7月17日木曜日

[Common Lisp] 多次元配列に対するmap

多次元配列の各要素に対して関数を適用した結果を返すmap系関数を作成する場合、 make-arrayに:displaced-toキーワードを指定して作成したベクターに対してmap-intoを使うと簡潔に書けそうです。

(defun map-array! (fn array)
  (let ((v (make-array (array-total-size array) :displaced-to array)))
    (map-into v fn v))
  array)

(asdf:load-system :alexandria)
(map-array! #'1+ (alexandria:copy-array #2A((1 2) (3 4))))
;; => #2A((2 3) (4 5))

以下、初めて知った多次元配列関連の関数

  • row-major-aref
  • array-row-major-index