2020年2月28日金曜日

slime-transpose-lists

 たとえば

((1 2 3)
 (4 5 6)
 (7 8 9))

 を

((1 4 7)
 (2 5 8)
 (3 6 9))

 という風に縦横を変換したい。
 パッと考えて二重ループで……とごちゃごちゃ考えたのだけれど、面倒臭い。きっとどこかにありそうだ。elisp、CommonLisp関連でググってもなかなか、見つからず、きっと名前に「tranpose」が入っているにちがいない、と考えてEmacsの「describe-function」で見つけた。

(slime-transpose-lists LIST-OF-LISTS)

Not documented.

 まさにこれ。ソースを見たら

( defun  slime-transpose-lists (list-of-lists)
  ( let ((ncols (length (car list-of-lists))))
    ( cl-loop for col-index below ncols
             collect ( cl-loop for row in list-of-lists
                              collect (elt row col-index)))))

 やはり二重ループ。
 それでもLispだとたったこれだけの行数で書ける。
 というか、簡単に書けてしまうから標準でなかったのかも。