3

要するに、このシバンを抽象化して、毎回ファイル名を指定しなくても文字通りコピーして他の .ML ファイルに貼り付けることができるようにしたいと思います。

#!/usr/bin/env ocamlscript -o hello

print_endline "Hello World!"

少し省略してもよいことはわかっていますが、すべてのバイナリにWindows 名 ( ) ではなく-o helloUNIX 名 ( ) を付けたいと考えています。hellohello.ml.exe

これを行うには、複雑なシバンが必要です。望ましい動作をする Clojure の例:

":";exec clj -m `basename $0 .clj` $0 ${1+"$@"}
":";exit

Clojure は Javacljベースであるため、ファイルのベース名 (somethingではなくsomething.clj) が必要です。ベース名を取得するには、複数行のシバンが必要です。単一行のシバンは、単一の単純な静的コマンド ライン引数しか処理できないためです。複数行のシバンを実行するには、次の構文を同時に実行する必要があります。

  • シェルコマンドをシェルに送信します
  • メイン言語からシェル コマンドを非表示にします

これを行うOCamlのトリックを知っている人はいますか? 私は成功せずに次のことを試しました:

(*
exec ocamlscript -o `basename $0 .ml` $0 ${1+"$@"}
exit
*)

let rec main = print_endline "Hello World!"
4

3 に答える 3

7

あなたが探しているのは、シェルと Objective Caml polyglot (シェル部分が ocaml インタープリターを呼び出して実際の作業を実行する場所) です。これは比較的単純なものです。ocamlscript要点はわかりませんが、必要に応じて使用に合わせてください。

#!/bin/sh
"true" = let exec _ _ _ = "-*-ocaml-*- vim:set syntax=ocaml: " in
exec "ocaml" "$0" "$@"
;;
(* OCaml code proper starts here *)
print_endline "hello"
于 2011-09-29T23:26:13.367 に答える
3

いくつかの試行の後、私はこのシバンを見つけました:

#!/bin/sh
"true" = let x' = "" in (*'
    sh script here
*) x'

これは、構文の非互換性にまったく悩まされることなく、OCaml コメント内に完全なシェル スクリプトを記述できるため、Gilles の提案の一種の改良です。

スクリプトは、コメントの最後に到達する前に(たとえば、execまたはで) 終了する必要があります。そうしないと、構文エラーが発生します。exitこれは簡単に修正できますが、このようなトリックの使用目的に関してはあまり役に立ちません。

以下は、OCaml 側のランタイム オーバーヘッドがゼロであるバリアントですが、新しい型名を宣言します (これが煩わしい場合は、任意に複雑なものを選択してください)。

#!/bin/sh
type int' (*' >&- 2>&-
    sh script here
*)

たとえば、モジュール Str および Unix を使用して OCaml コードを実行し、パラメーターを渡したときにコンパイルするスクリプトを次に示します--compile

#!/bin/sh
type int' (*' >&- 2>&-
    if [ "$1" = "--compile" ]; then
        name="${0%.ml}"
        ocamlopt -pp 'sed "1s/^#\!.*//"' \
          str.cmxa unix.cmxa "$name.ml" -o "$name" \
          || exit
        rm "$name".{cm*,o}
        exit
    else
        exec ocaml str.cma unix.cma "$0" "$@"
    fi
*)
于 2015-02-27T15:42:15.550 に答える
0

ocamlscript がこれをサポートしているとは思いません。完全な出力ベース名を指定せずにコンパイル済みバイナリの拡張子をカスタマイズできるようにするために、作成者に機能要求を送信する価値がある場合があります。

于 2011-09-30T00:49:46.287 に答える