(* 2017/10/17 コンピュータ概論資料 : 変数と代入 *)
(* 課題 : 20171010-QQQQ *)
(* 提出者 : 理工太郎 *)

(* 値が代入されていない「名前:文字列(変数)」は、文字式のまま処理される *)
(* 文字式「a」の「(評価した)値」は、「a」そのもの *)

a

(* 「=」を使って「名前:変数」に、「値」を「代入」することができる *)
(* 「a」に値「1」を代入する : 代入によって、変数は「値を持つ」 *)
a=1

(* 文字式「a」の中に含まれている「名前:変数」が値を持てば、値に変換される *)
a

(* 「=」では、「右辺の式の値」が「評価された後」に代入される *)
b = a (* 「a」の値は「1」なので、これは「b=1」と同じ *)

b

(* 変数の値は、代入によって、あとから何度でも変えられる (「代入」は「定義」ではない) *)
a = 2

(* 変数 b の値は 1 なので、変数 a とは無関係 *)
b

(* 「:=」では、「右辺の式の値」が「評価されず」に代入される *)
c := a　(* 変数 c には、文字式「a」そのものが入る *)

(* 評価は、再帰的に行われる : 評価した式の中にまだ値があれば、さらに評価される *)
c (* 評価　: c -> a -> 2 *)

(* 変数 c の値に変数 a が含まれるので、変数 a の値の変更が式 c の値の変更なる *)
a = 3

c(* 評価　: c -> a -> 3 *)

(* 「?」で、変数の「現在の代入値」を知ることができる *)
(* 一回分(再帰的でない)の評価 *)
?b

?c

(* Unset : 代入の効果(値を持つ)を取り消すことができる *)
Unset[a]

b

(*　文字式「c」の評価した値は、文字式「a」になる *)
c (* c -> a : ここで評価はおしまい *)

(* 変数に一般の(文字)式を代入することもできる *)
(* 以下、変数の代入のふるまいのおさらい *)
d = e + b

d

?d

e=5

d

e = 10

d

Unset[e]

d

e=20

d

?d