LispでList分割
divideとかsplitとかseparateとか、思い付いたそれっぽいキーワードで探してみたがなさそう。ありそうだけれども。Lisp で乱数リストを作る - Shammerismで書いたように、アルゴリズムのおさらいをしようとしているので、このリストの分割ができる関数が重要なのだがないとは、、、というわけで作成。
? (defun divide (l n) (if (null l) nil (values (subseq l 0 n) (subseq l n)))) DIVIDE ? (divide '(0 1 2 3 4 5) 3) (0 1 2) (3 4 5) ? (divide '(0 1 2 3 4 5 6 7) 2) (0 1) (2 3 4 5 6 7) ?
書いてみて気付いたが、普通に sequence を使え、ということか。だが、ほしいのはちょうど半分で分割してくれる関数だ。half という関数を作成してみる。
? (defun half (l) (if (evenp (length l)) (values (subseq l 0 (/ (length l) 2)) (subseq l (/ (length l) 2))) (values (subseq l 0 (/ (- (length l) 1) 2)) (subseq l (/ (- (length l) 1) 2))))) HALF ? (half '(0 1)) (0) (1) ? (half '(0 1 2)) (0) (1 2) ? (half '(0 1 2 3)) (0 1) (2 3) ? (half '(0 1 2 3 4)) (0 1) (2 3 4) ?
とりあえず、これでいいか。このhalfは後で修正するかもしれない。