OCaml でこの Python イディオムをエミュレートするにはどうすればよいですか?
if __name__=="__main__":
main()
他のプログラミング言語での例については、 RosettaCodeを参照してください。
OCaml でこの Python イディオムをエミュレートするにはどうすればよいですか?
if __name__=="__main__":
main()
他のプログラミング言語での例については、 RosettaCodeを参照してください。
Ocaml にはメインモジュールという概念はありません。プログラム内のすべてのモジュールは同等です。したがって、この Python イディオムを直接翻訳することはできません。
Ocaml での通常の方法は、 への呼び出しを含む別のファイルとmain
、スタンドアロンの実行可能ファイルでのみ意味を持つコマンド ライン解析などの他のものを用意することです。コードをライブラリとしてリンクするときは、そのソース ファイルを含めないでください。
モジュールの名前を取得する方法はありますが、デバッグのみを目的としているため、かなりハックです。これは、モジュールの動作を変更せずにモジュールの名前を変更できるという通常の前提に違反しています。それに頼ると、あなたのコードを読んでいる他のプログラマーがあなたを呪うでしょう。このメソッドは娯楽目的でのみ提供されており、実際には使用しないでください。
let name_of_this_compilation_unit =
try assert false with Assert_failure (filename, _, _) -> filename
Sys.executable_name
コンパイル単位の名前をまたはと比較できますSys.argv.(0)
。これは、特定の名前を持つトップレベル スクリプトに依存しない Python のイディオムと実際には同じではないことに注意してください。
$ ocamlc -o scriptedmain -linkall str.cma scriptedmain.ml
$ ./scriptedmain
Main: The meaning of life is 42
$ ocamlc -o test -linkall str.cma scriptedmain.ml test.ml
$ ./test
Test: The meaning of life is 42
scriptedmain.ml:
let meaning_of_life : int = 42
let main () = print_endline ("Main: The meaning of life is " ^ string_of_int meaning_of_life)
let _ =
let program = Sys.argv.(0)
and re = Str.regexp "scriptedmain" in
try let _ = Str.search_forward re program 0 in
main ()
with Not_found -> ()
test.ml:
let main () = print_endline ("Test: The meaning of life is " ^ string_of_int Scriptedmain.meaning_of_life)
let _ =
let program = Sys.argv.(0)
and re = Str.regexp "test" in
try let _ = Str.search_forward re program 0 in
main ()
with Not_found -> ()
RosettaCodeに投稿されました。