Получить имя скрипта в OCaml? - PullRequest
       32

Получить имя скрипта в OCaml?

1 голос
/ 30 сентября 2011

Есть ли в OCaml способ получить имя текущего файла / модуля / скрипта? Что-то вроде:

  • C / C ++'s argv[0]
  • Python's sys.argv[0]
  • Perl / Ruby's $0
  • Эрланга ?FILE
  • C # 's ProgramName.Environment.CommandLine
  • Фактор scriptname/script
  • Go's os.Args[0]
  • Haskell's System/getProgName
  • Java System.getProperty("sun.java.command").split(" ")[0]
  • Node.js's __filename
  • и т.д.

Ответы [ 4 ]

11 голосов
/ 30 сентября 2011

Я ничего не знаю об OCaml, но гугл появился

Sys.argv.(0)

См. http://caml.inria.fr/pub/docs/manual-ocaml/manual003.html#toc12

3 голосов
/ 30 сентября 2011

Полагаю, вы пишете сценарии в OCaml.Тогда Sys.argv. (0) - самый простой способ получить имя скрипта.Модуль Sys также предоставляет имя Sys.executable_name, но его семантика немного отличается:

let _ = prerr_endline Sys.executable_name;Array.iter prerr_endline Sys.argv ;;

Если я запусту указанную выше строку, поместив строку в test.ml с помощью ocaml test.ml hello world, у меня будет:

/usr/local/bin/ocaml         - executable_name
test.ml                      - argv.(0)
hello                        - argv.(1)
world                        - argv.(2)

Поэтому OCaml toplevel делает что-то необычное для argv.

В общем, получить текущее имя модуля в OCaml непросто по нескольким причинам:

  • Модули ML настолько гибки, чтоони могут быть псевдонимами, включаться в другие модули и применяться к функторам модулей.
  • OCaml не встраивает имя модуля в свой объектный файл.

Один из возможных возможных способов - добавитьпеременная для имени модуля самостоятельно, например:

let ml_source_name = "foobar.ml"

Это определение может быть автоматически вставлено при некоторой предварительной обработке.Однако я не уверен, что CamlP4 может иметь имя файла исходного обрабатываемого файла.

Если ваша основная цель - простые сценарии, то, конечно, эта предварительная обработка слишком сложна, я боюсь.

1 голос
/ 30 сентября 2011
let _ =
    let program = Sys.argv.(0) in
        print_endline ("Program: " ^ program)

И отправлено на RosettaCode .

0 голосов
/ 06 мая 2019

В OCaml> = 4.02.0 вы также можете использовать __FILE__, чтобы получить имя файла текущего файла, которое похоже на __filename узла и не совпадает с Sys.argv.(0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...