エラー発生
「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.run
をCommand_unix.run
に書き換えると、うまく動作しました。
まとめ
とりあえず、私は上記のようなやり方で対処しましたが、正しいかどうかは定かではありません。一応Twitterにて発信し、OCamlの有識者の目に止まれば…なんて思っていましたが、なんの反応も無い感じでした。OCamlのコミュニティはどこにあるのだろう?
総じて思うことは、OCamlはやはりドキュメントが少ない。エラーメッセージが優しくない。好きな言語なのだけれどな……人気ないのだろうか?