2022/06/27

「Real World OCaml」のCommand-Line Parsingの章にて

エラー発生

「Real World OCaml」(以下RWO)のCommand-Line Parsingの章を読んで、コードを試していたところ、例となっているプログラムのCommand.runがうまく動作しませんでした。

utopでチェックしてみたところ、以下のような表示になりました。


# open Core ;;
# #show Core.Command.run ;;
File "_none_", line 1:
Alert deprecated: Core.Command.run
[since 2021-03] Use [Command_unix]
val run : [`Use_Command_unix]

廃止になったのでCommand_unixを使いなさい、という警告が出ました。そこで、以下のようにして調べてみようと思い試してみたところ、


# #show Core.Command_unix.run ;;
Unknown element.
# open Command_unix ;;
Error: Unbound module Command_unix
# open Core.Command_unix ;;
Error: Unbound module Core.Command_unix

は?

そんなもんどこにあるんじゃ?

ということで、ソースコードを探しに行くことになりました。すると、/.opam/default/lib/core_unix/内にありました、command_unixが。

ということは


# open Core_unix;;
Error: Unbound module Core_unix
Hint: Did you mean Core__Pid?
# require "core_unix";;
# open Core_unix;;
# #show Core_unix.Command_unix.run;;
Unknown element.
# #show Command_unix.run;;
Unknown element. 

は?

ええい、これでどうや!!


# #require "core_unix.command_unix";;
# #show Command_unix.run ;;
val run :
  ?verbose_on_parse_error:bool ->
  ?version:string ->
  ?build_info:string ->
  ?argv:string list ->
  ?extend:(string list -> string list) ->
  ?when_parsing_succeeds:(unit -> unit) ->
  ?complete_subcommands:(path:string list ->
                         part:string -> string list list -> string list option) ->
  Command.t -> unit

はい、やっと発見しました。

ということで、Command-Line Parsingの章では、duneファイルを以下のように書き、


(executable
  (name       md5)
  (libraries  core core_unix.command_unix)
  (preprocess (pps ppx_jane)))

Command.runCommand_unix.runに書き換えると、うまく動作しました。

まとめ

とりあえず、私は上記のようなやり方で対処しましたが、正しいかどうかは定かではありません。一応Twitterにて発信し、OCamlの有識者の目に止まれば…なんて思っていましたが、なんの反応も無い感じでした。OCamlのコミュニティはどこにあるのだろう?

総じて思うことは、OCamlはやはりドキュメントが少ない。エラーメッセージが優しくない。好きな言語なのだけれどな……人気ないのだろうか?