エラトステネスの篩を酒のんだ勢いで書いたら汚くなった

タイトルの通りです。
汚いしなんか遅い気がするのでそのうち誰かに見てもらおうかな・・・
なんでこんなの書いたかというとProjectEulerで使う機会がありそうだったからです。
でもintでいいのかは疑問。

let eratosthenes number =
  let rec del_list x list list'=
    match list with
      | [] -> list'
      | hd::rest -> if (hd mod x) = 0 then del_list x rest list' else del_list x rest (list'@[hd]) in
  let makelist num =
    let rec sub_makelist num l = 
      match num with
	| 2 -> 2::l
	| num -> sub_makelist (num-1) (num::l) in
    sub_makelist num [] in
  let rec sub_eratosthenes numlist primelist =
    match numlist with
      | [] -> primelist
      | x::rest -> let numlist' = (del_list x numlist []) in
		   let primelist' = (primelist@[x]) in
		   if x * x > (List.hd (List.rev numlist)) then (primelist @ numlist)
		   else sub_eratosthenes numlist' primelist' in
  sub_eratosthenes (makelist number) [];;