配列の配列をフラットな配列にする - lisp-cookbook-ja/common-lisp GitHub Wiki

配列

配列の配列をフラットな配列にする

flatten はLISP系言語で良く使われるユーティリティ(ANSI CLには含まれていません)ですが、殆どがリストにしか対応していません。 ベクタ版のものが必要な場合は、下記のように書けるでしょう。

(defun vector-flatten (vec)
  (cond ((not (vectorp vec)) vec)
        ((zerop (length vec)) #())
        ((vectorp (aref vec 0))
         (concatenate 'vector 
                      (vector-flatten (aref vec 0)) 
                      (vector-flatten (subseq vec 1))))
        (T (concatenate 'vector 
                        (vector (aref vec 0)) 
                        (vector-flatten (subseq vec 1))))))

(vector-flatten #(1 2 3 #(4 #(5) 6 '(7 8) 9)))
;=> #(1 2 3 4 5 6 '(7 8) 9)