私は、セミコロンがREPLのターミネータとして使用されていることを知っています。しかし、私はソースファイルでそれらをいつ使うのか混乱しています。SMLでセミコロンを使用するのはいつですか?
たとえば、val x = 1
以降は必要ありません。しかし、use "foo.sml"
の後に省略すると、コンパイラはそれについて文句を言います。
次に、セミコロンの使用に関するルールは何ですか?
私は、セミコロンがREPLのターミネータとして使用されていることを知っています。しかし、私はソースファイルでそれらをいつ使うのか混乱しています。SMLでセミコロンを使用するのはいつですか?
たとえば、val x = 1
以降は必要ありません。しかし、use "foo.sml"
の後に省略すると、コンパイラはそれについて文句を言います。
次に、セミコロンの使用に関するルールは何ですか?
セミコロンは、SMLの多くの構文エンティティに使用されます。これらは、通常、式や宣言などのシーケンスを作成するために使用されます。ここではSMLの文法へのリンクです:
http://www.mpi-sws.org/~rossberg/sml.html
あなたのケースでは、あなたは宣言のセミコロン(12月クラス)に興味を持っています。 decのシーケンスを作成するセミコロンはオプションです。あなたはSMLモジュールを書くときに実際にそれを必要とすることは決してありません。それを見るのはまれです。たとえば、ソースファイルで
structure S = struct
val x = 5
fun f x = x
val z = x + x
end
ない
structure S = struct
val x = 5;
fun f x = x;
val z = x + x
end
、あなたが正常にセミコロンを使用する唯一の場所は、副作用を持つ式を分離しています。たとえば、
val x = ref 5
val _ = (x := !x + 1; x := !x+ 2)
ですが、この使用方法はまれです。
smlnj replはセミコロンを見るときにのみ宣言を評価するので、値を表示または再生したいときは常にセミコロンを使用する必要があります。私はそれが宣言ではないので、use "foo.sml";
のケースは混乱していると思います。それは表現です。 replがuse "foo.sml"
のような式をval _ = use "foo.sml"
に変換すると思います。したがって、上記のようにreplに本当に実行させるためにセミコロンを必要とします。補足として、use
には何も特別なものはありません。これは単純にタイプstring -> unit
の関数です。
ありがとうございました。今では宣言でなぜそれが必要でないのか分かります。そして、あなたがなぜ 'use" foo.sml ";'で必要であるのか説明してください。私はまだそれを控えていません。 – Ben
私は上記を明確にしようとしました。 – seanmcl
+1 SML文法リファレンスです。 –