17 |
| Img of ImageInfo.info |
| Img of ImageInfo.info |
18 |
| KV of Kernel.kernel |
| KV of Kernel.kernel |
19 |
|
|
20 |
val evalStatics : Simple.block -> value Var.Map.map |
val evalStatics : Var.Set.set * Simple.block -> value Var.Map.map |
21 |
|
|
22 |
end = struct |
end = struct |
23 |
|
|
25 |
structure BV = BasisVars |
structure BV = BasisVars |
26 |
structure S = Simple |
structure S = Simple |
27 |
structure VMap = Var.Map |
structure VMap = Var.Map |
28 |
|
structure VSet = Var.Set |
29 |
structure VTbl = Var.Tbl |
structure VTbl = Var.Tbl |
30 |
|
|
31 |
datatype value |
datatype value |
109 |
(BV.op_subscript, fn (y, [SK, NK], xs) => ??), |
(BV.op_subscript, fn (y, [SK, NK], xs) => ??), |
110 |
(BV.fn_CL, fn (y, _, xs) => assign(y, Op.CL, xs)), |
(BV.fn_CL, fn (y, _, xs) => assign(y, Op.CL, xs)), |
111 |
*) |
*) |
112 |
(BV.fn_convolve, fn [KV h, Img info] => FV(FieldDef.CONV(info, h))), |
(BV.op_convolve, fn [Img info, KV h] => FV(FieldDef.CONV(0, info, h))), |
113 |
|
(BV.fn_convolve, fn [KV h, Img info] => FV(FieldDef.CONV(0, info, h))), |
114 |
(BV.fn_cos, realUnOp Math.cos), |
(BV.fn_cos, realUnOp Math.cos), |
115 |
(* |
(* |
116 |
(BV.fn_dot, vectorOp Op.Dot), |
(BV.fn_dot, vectorOp Op.Dot), |
152 |
| NONE => raise Fail("undefined variable " ^ Var.uniqueNameOf x) |
| NONE => raise Fail("undefined variable " ^ Var.uniqueNameOf x) |
153 |
(* end case *)) |
(* end case *)) |
154 |
|
|
155 |
fun evalExp (env, e) = (case e |
fun apply (env, f, mvs, xs) = |
156 |
of S.E_Var x => evalVar env x |
if List.all (fn x => VMap.inDomain(env, x)) xs |
157 |
| S.E_Lit(Literal.Int i) => IV i |
then (* try *)( |
|
| S.E_Lit(Literal.Float f) => RV(FloatLit.toReal f) |
|
|
| S.E_Lit(Literal.String s) => SV s |
|
|
| S.E_Lit(Literal.Bool b) => BV b |
|
|
| S.E_Tuple _ => raise Fail "E_Tuple" |
|
|
| S.E_Apply(f, mvs, xs, _) => ( |
|
|
(* try *)( |
|
158 |
if Var.same(f, BV.fn_load) |
if Var.same(f, BV.fn_load) |
159 |
then loadImage(mvs, List.map (evalVar env) xs) |
then SOME(loadImage(mvs, List.map (evalVar env) xs)) |
160 |
else (case VTbl.find tbl f |
else (case VTbl.find tbl f |
161 |
of SOME evalFn => evalFn (List.map (evalVar env) xs) |
of SOME evalFn => SOME(evalFn (List.map (evalVar env) xs)) |
162 |
| NONE => raise Fail("Eval.exvalExp: unknown function " ^ Var.nameOf f) |
| NONE => NONE |
163 |
(* end case *)) |
(* end case *)) |
164 |
) handle ex => ( |
) handle ex => ( |
165 |
TextIO.output (TextIO.stdErr, concat [ |
TextIO.output (TextIO.stdErr, concat [ |
167 |
String.concatWith "," (List.map Var.uniqueNameOf xs), |
String.concatWith "," (List.map Var.uniqueNameOf xs), |
168 |
") fails with exception ", exnName ex, "\n" |
") fails with exception ", exnName ex, "\n" |
169 |
]); |
]); |
170 |
raise ex)) |
raise ex) |
171 |
|
else NONE |
172 |
|
|
173 |
|
fun evalExp (env, e) = (case e |
174 |
|
of S.E_Var x => VMap.find (env, x) |
175 |
|
| S.E_Lit(Literal.Int i) => SOME(IV i) |
176 |
|
| S.E_Lit(Literal.Float f) => SOME(RV(FloatLit.toReal f)) |
177 |
|
| S.E_Lit(Literal.String s) => SOME(SV s) |
178 |
|
| S.E_Lit(Literal.Bool b) => SOME(BV b) |
179 |
|
| S.E_Tuple _ => raise Fail "E_Tuple" |
180 |
|
| S.E_Apply(f, mvs, xs, _) => apply(env, f, mvs, xs) |
181 |
| S.E_Cons xs => raise Fail "TODO: E_Cons" |
| S.E_Cons xs => raise Fail "TODO: E_Cons" |
182 |
| S.E_Input(ty, name, optDefault) => let |
| S.E_Input(ty, name, optDefault) => raise Fail "impossible" |
183 |
|
| S.E_Field fld => SOME(FV fld) |
184 |
|
| S.E_LoadImage info => SOME(Img info) |
185 |
|
(* end case *)) |
186 |
|
|
187 |
|
fun evalStatics (statics, blk) = let |
188 |
|
fun evalBlock (env, S.Block stms) = let |
189 |
|
exception Done of value VMap.map |
190 |
|
fun evalStm (stm, env) = (case stm |
191 |
|
of S.S_Assign(x, S.E_Input(ty, name, optDefault)) => |
192 |
|
if VSet.member(statics, x) |
193 |
|
then let |
194 |
val optDefault = Option.map (evalVar env) optDefault |
val optDefault = Option.map (evalVar env) optDefault |
195 |
val SOME value = (case ty |
val input = (case ty |
196 |
of Ty.T_Bool => |
of Ty.T_Bool => |
197 |
Inputs.getInput(name, (Option.map BV) o Bool.fromString, optDefault) |
Inputs.getInput(name, (Option.map BV) o Bool.fromString, optDefault) |
198 |
| Ty.T_Int => |
| Ty.T_Int => |
206 |
]) |
]) |
207 |
(* end case *)) |
(* end case *)) |
208 |
in |
in |
209 |
value |
case input |
210 |
|
of SOME v => VMap.insert(env, x, v) |
211 |
|
| NONE => raise Fail("error getting required input " ^ name) |
212 |
|
(* end case *) |
213 |
end |
end |
214 |
| S.E_Field fld => FV fld |
else env |
215 |
| S.E_LoadImage info => Img info |
| S.S_Assign(x, e) => (case evalExp(env, e) |
216 |
(* end case *)) |
of SOME v => |
217 |
|
(print(concat[Var.uniqueNameOf x, " = ", toString v, "\n"]); |
218 |
fun evalBlock (env, S.Block stms) = let |
VMap.insert(env, x, v) |
219 |
fun evalStm (stm, env) = (case stm |
) |
220 |
of S.S_Assign(x, e) => VMap.insert(env, x, evalExp(env, e)) |
| NONE => env |
221 |
| S.S_IfThenElse(x, b1, b2) => (case evalVar env x |
(* end case *)) |
222 |
of BV true => evalBlock(env, b1) |
| S.S_IfThenElse(x, b1, b2) => (case VMap.find(env, x) |
223 |
| BV false => evalBlock(env, b2) |
of SOME(BV true) => evalBlock(env, b1) |
224 |
| _ => raise Fail "type error" |
| SOME(BV false) => evalBlock(env, b2) |
225 |
|
| SOME _ => raise Fail "type error" |
226 |
|
| NONE => raise (Done env) |
227 |
(* end case *)) |
(* end case *)) |
228 |
| S.S_New _ => raise Fail "unexpected new actor" |
| S.S_New _ => raise Fail "unexpected new actor" |
229 |
| S.S_Die => raise Fail "unexpected die" |
| S.S_Die => raise Fail "unexpected die" |
230 |
| S.S_Stabilize => raise Fail "unexpected stabilize" |
| S.S_Stabilize => raise Fail "unexpected stabilize" |
231 |
(* end case *)) |
(* end case *)) |
232 |
in |
in |
233 |
List.foldl evalStm env stms |
(List.foldl evalStm env stms) handle Done env => env |
234 |
|
end |
235 |
|
in |
236 |
|
evalBlock (VMap.empty, blk) |
237 |
end |
end |
|
|
|
|
fun evalStatics staticInit = evalBlock (VMap.empty, staticInit) |
|
238 |
|
|
239 |
end |
end |