2014年5月18日日曜日

[OCaml]Coreでusleep

sleepシステムコールでは1秒未満で待つことができないので、usleepを使おうと思ったが、OCamlのUnix標準モジュールではサポートされていなかった。
ここを見るとselectシステムコールを使う例があったので、試してみたら、構文エラーになった。
何で?と思って調べたら、自分の環境では常にCoreを使うようにしていた。
open Core.StdしているとUnix.selectはCore版になるのね...
Coreを使っている場合は以下のようにusleep関数を定義すればOK。

open Core.Std

let usleep time =
  ignore @@ Unix.select ~read:[] ~write:[] ~except:[] ~timeout:(`After time) ()


utopで確認。

utop[14]> let print_now () = print_endline @@ Time.to_string @@ Time.now ();;
val print_now : unit -> unit = <fun>
utop[18]> print_now (); usleep 0.25; print_now ();;
2014-05-18 19:04:40.408135+09:00
2014-05-18 19:04:40.659611+09:00 ←◆0.25sec待機
- : unit = ()

Coreで再定義する前の関数を参照する方法は無いのかな?

参考