1.4 変数の束縛と識別子
問 1.5
以下の各々の文字列について,それが値を表す変数として使用できるか否かを判定せよ.
1stLady
name1
__
’a
_abc
%1
123
ten%
##’
()
and
+
++
さらに,実際に値の束縛を行い,判定が正しいことを確かめよ.
解答例 以下,変数としての使用が可の場合はSML#による束縛の例を,不可の場合はその簡単な説明を付す。
-
•
1stLady
不可。”1”と”stLady2”の2語である。変数束縛の位置に現れると,”1”が ”stlady”に適応されたパターン式と見なされエラーとなる。
-
•
name1
# val name1 = "name1"; val name1 = "name1" : string
-
•
__
不可。”_”は匿名パターンを表す予約語。 ”_”が”_”に適用されたパターン式と解釈され,”_”がコンストラクターではないのでエラーとなる。
-
•
’a
不可。”’”で始まる名前は型変数にのみ使用可能。
-
•
_abc
不可。”_”が”abc”に適用されたパターン式と解釈されエラーとなる。
-
•
%1
不可。
%
と1
の2語と解釈される。ちなみに、
%
が1の型(int、intInfo等)を引数としてとる コンストラクタと宣言されていれば、式またはパターンとして受理される。# datatpe foo = % of int datatype foo = % of int # %1; val it = % 1 : foo
そのような宣言がなければ、型エラーとなる。
-
•
123
不可。定数は変数として使用できない。ただしval 123 = 123は成功する。
-
•
ten%
不可。
ten
と%
の2語と解釈される。ちなみに、
%
が型の変数と宣言され、ten
が型を引数とする コンストラクタと宣言されていれば、受理される。# datatype foo = ten of string; datatype foo = ten of string # val % = "%"; val % = "%" : string # ten%; val it = ten "%" : foo
それ意外の場合、型エラーとなる。
-
•
##’
不可。”##”と”’”の2語と見なされ,”’”が型の名前に使用されていないので構文 エラーとなる。
-
•
()
不可。”()”は空の組を表す式。
-
•
and
不可。”and”は予約語である。
-
•
+
可能であるが,トップレベルの環境では”
+
”に対してinfix
宣言が有効となってい るので,この宣言を取り消さないと通常の変数としては使用できない。 -
•
++
# val ++ = 1; val ++ = 1 : int