Shammer's Philosophy

My private adversaria

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は後で修正するかもしれない。