では、let <decs> in <exp>
1<decs>
つ以上の宣言が必要です。
あなたの場合、7行目でそうしますy = 1
-これは代入ではなく比較です。つまり、C++ では、 を実行するのと同じy == 1
です。非 ref 変数に代入することはできません。(そして、一般に、ref 変数はできるだけ避けたいと思います。)その代わりに、 の名前でval y = 1
新しい値を作成することもできます。新しい価値を創造します。)y
y
同様に、9 行目で を実行しますx := 0
。これは宣言ではなく、値0
を参照値 に代入し、x
単位を返す式です。
さらに、let ステートメントで複数の宣言を行うことができるため、入れ子にする必要はありません。
最後にp(x)
、トップレベルに書き込みます。前の宣言がセミコロンで終わる場合、トップレベルでのみ式を書くことができます。それ以外の場合は、宣言の一部であると見なされます。あれは
val a = 5
6
と解釈される
val a = 5 6
要するに、これを次のように書き換えることができます。
val x = ref 0;
fun p(y': int ref)=
let
val y = !y' (* this line might as well be deleted. *)
val y = 1
in
x := 0;
y' := y
end;
p(x)
または、SML には優れた型推論があるため、短いバージョン:
val x = ref 0;
fun p y' = (x := 0; y' := 1);
p x
しかし、私はこれを言います。C++ などの言語を使用している場合は、多くの言語を使用したくなるかもしれません'a ref
が、それらの使用を最小限に抑えると、SML のコードがよりクリーンになることがよくあることに気付くでしょう。(および他の関数型言語。)