# 式expを環境(変数をキーとしてその変数の値を得るハッシュ)envのもとで # 評価した値を得る def evaluate(exp,env) # 数値の時は,値を浮動小数点数に変換する if exp.kind_of?(Numeric) exp.to_f # 変数の時は,ハッシュenvの中から変数の値を得て浮動小数点数に変換する elsif exp.kind_of?(String) env[exp].to_f # クラスExprのインスタンスの時は,クラスExprのインスタンスメソッド evalを呼ぶ elsif exp.kind_of?(Expr) exp.eval(env) end end class Expr def eval(env) # 式 @left を環境 envの元で評価した値をローカル変数leftに代入する left = ### (1) ### # 式 @right を環境 envの元で評価した値をローカル変数rightに代入する right = ### (2) ### if @op == "+" then left + right elsif @op == "-" then left - right elsif @op == "*" then left * right elsif @op == "/" then left / right else 0 end end end