新宿にて

明治に通っているJSEC同期生と一緒に飯食ってきた。久々に会ったので、色々と話しこんでいるうちに閉店時間になっちゃったよ。法学部で文系の人だけど、ふつうに理系な話もできる人なので話しやすい。パソコンの話になったときに、Linux見たことないらしいのでその場でノートPC起動&Beryl実演。やはりBerylは一般人受けがいい。レストランでUbuntuとかどう見てもキモヲタです。本当に(ry

その他外山恒一の話から、Lispの布教活動が難航している件、コミュニケーション能力の件、女子コミュニティの恐怖など雑多な話をしてた。

OCaml習作: マージソート

できた。

arrayでデータを受け取ってlistで返すという謎仕様なのは、データの列を分割するのはarrayのほうが簡単で、分割してソートした結果を組み立てていくのはlistのほうが簡単だったから。

open Array
open List

let rec mysort comp arr =
  match arr with
      [||] -> []
    | [|x|] -> [x]
    | [|x; y|] -> if (comp x y) then [x; y] else [y; x]
    | arr -> 
	let len = Array.length arr in
	let head = mysort comp (sub arr 0 (len / 2)) in
	let tail = mysort comp (sub arr (len / 2) (len - (len / 2))) in
	let rec merge_result ret ls1 ls2 =
	  match ls1, ls2 with
	      [], ls2 -> append (rev ret) ls2
	    | ls1, [] -> append (rev ret) ls1
	    | e1 :: es1, e2 :: es2 ->
		if (comp e1 e2) then
		  merge_result (e1 :: ret) es1 ls2
		else
		  merge_result (e2 :: ret) ls1 es2
	in
	  merge_result [] head tail;;