5

OCaml でこの Python イディオムをエミュレートするにはどうすればよいですか?

if __name__=="__main__":
   main()

他のプログラミング言語での例については、 RosettaCodeを参照してください。

4

2 に答える 2

6

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 のイディオムと実際には同じではないことに注意してください。

于 2011-09-29T23:30:07.610 に答える
1
$ 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に投稿されました。

于 2011-09-30T18:42:51.763 に答える