私はStandardMLを学び始め、今はNewJerseyコンパイラのStandardMLを使おうとしています。
これでインタラクティブループを使用できますが、ソースファイルをスタンドアロンの実行可能ファイルにコンパイルするにはどうすればよいですか?
たとえば、Cでは次のように書くことができます。
$ gcc hello_world.c -o helloworld
次に、helloworldバイナリを実行します。
SML NJコンパイルマネージャーのドキュメントを読みましたが、明確な例がありません。
また、別のSMLコンパイラ(スタンドアロンのバイナリ作成を可能にする)は利用できますか?
MosML と MLton の両方に、スタンドアロンのバイナリファイルを作成する可能性もあります。 mosmlcコマンドを介したMosMLおよびmltonコマンドを介したMLton。
MLtonには対話型ループはありませんが、プログラム全体を最適化するコンパイラであることに注意してください。これは基本的に、コンパイルにかなりの時間がかかることを意味しますが、順番に 信じられないほど高速 SMLプログラムを生成します。
SML/NJの場合、CM.mk_standalone
関数を使用できますが、これはCMユーザーマニュアルの45ページでは推奨されていません。代わりに、ml-buildコマンドを使用することをお勧めします。これにより、SML/NJヒープイメージが生成されます。ヒープイメージは@SMLloadパラメータを使用して実行する必要があります。または、サポートされているシステムがある場合は、 heap2exec プログラムを使用できます。そうでない場合は、代わりにMLtonを使用することをお勧めします。
以下を使用して、有効なSML/NJヒープイメージを生成できます。
test.cm:
Group is
test.sml
$/basis.cm
test.sml:
structure Test =
struct
fun main (prog_name, args) =
let
val _ = print ("Program name: " ^ prog_name ^ "\n")
val _ = print "Arguments:\n"
val _ = map (fn s => print ("\t" ^ s ^ "\n")) args
in
1
end
end
また、ヒープイメージを生成するには、次を使用できます。ml-build test.cm Test.main test-image
次に、sml @SMLload test-image.XXXXX arg1 arg2 "this is one argument"
で実行します。ここでXXXXXはアーキテクチャです。
ある時点でMLtonを使用することにした場合は、メイン機能は必要ありません。これはすべてをトップレベルで評価するため、main関数を作成して、次のようなもので呼び出すことができます。
fun main () = print "this is the main function\n"
val foo = 4
val _ = print ((Int.toString 4) ^ "\n")
val _ = main ()
次に、mlton foo.sml
でコンパイルすると、「foo」という名前の実行可能ファイルが生成されます。あなたがそれを実行すると、それは結果としてこれを生成します:
./foo
4
this is the main function
これは1つのファイルにすぎないことに注意してください。複数のファイルがある場合は、MLtonsプロジェクトファイルであるMLB(MLベーシスファイル)を使用するか、cmファイルを使用してmlton projectr.mlb
でコンパイルする必要があります。