185 |
|
|
186 |
(* "eval" -- compute the export environment of a skeleton *) |
(* "eval" -- compute the export environment of a skeleton *) |
187 |
fun eval sk = let |
fun eval sk = let |
|
fun layer' f [] = DE.EMPTY |
|
|
| layer' f [x] = f x |
|
|
| layer' f (h :: t) = |
|
|
foldl (fn (x, r) => DE.LAYER (f x, r)) (f h) t |
|
|
|
|
188 |
fun evalDecl e (SK.Bind (name, def)) = |
fun evalDecl e (SK.Bind (name, def)) = |
189 |
DE.BINDING (name, evalModExp e def) |
DE.BINDING (name, evalModExp e def) |
190 |
| evalDecl e (SK.Local (d1, d2)) = |
| evalDecl e (SK.Local (d1, d2)) = |
191 |
evalDecl (DE.LAYER (evalDecl e d1, e)) d2 |
evalDecl (DE.LAYER (evalDecl e d1, e)) d2 |
192 |
| evalDecl e (SK.Seq l) = |
| evalDecl e (SK.Seq l) = evalSeqDecl e l |
193 |
foldl (fn (d, e') => |
| evalDecl e (SK.Par []) = DE.EMPTY |
194 |
DE.LAYER (evalDecl (DE.LAYER (e', e)) d, e')) |
| evalDecl e (SK.Par (h :: t)) = |
195 |
DE.EMPTY l |
foldl (fn (x, r) => DE.LAYER (evalDecl e x, r)) |
196 |
| evalDecl e (SK.Par l) = layer' (evalDecl e) l |
(evalDecl e h) t |
197 |
| evalDecl e (SK.Open s) = evalModExp e s |
| evalDecl e (SK.Open s) = evalModExp e s |
198 |
| evalDecl e (SK.Ref s) = |
| evalDecl e (SK.Ref s) = |
199 |
(SS.app (ignore o lookup e) s; DE.EMPTY) |
(SS.app (ignore o lookup e) s; DE.EMPTY) |
200 |
|
|
201 |
|
and evalSeqDecl e [] = DE.EMPTY |
202 |
|
| evalSeqDecl e (h :: t) = |
203 |
|
foldl (fn (d, e') => |
204 |
|
DE.LAYER (evalDecl (DE.LAYER (e', e)) d, e')) |
205 |
|
(evalDecl e h) |
206 |
|
t |
207 |
|
|
208 |
and evalModExp e (SK.Var sp) = lookSymPath e sp |
and evalModExp e (SK.Var sp) = lookSymPath e sp |
209 |
| evalModExp e (SK.Decl d) = evalDecl e d |
| evalModExp e (SK.Decl l) = evalSeqDecl e l |
210 |
| evalModExp e (SK.Let (d, m)) = |
| evalModExp e (SK.Let (d, m)) = |
211 |
evalModExp (DE.LAYER (evalDecl e d, e)) m |
evalModExp (DE.LAYER (evalSeqDecl e d, e)) m |
212 |
| evalModExp e (SK.Ign1 (m1, m2)) = |
| evalModExp e (SK.Ign1 (m1, m2)) = |
213 |
(ignore (evalModExp e m1); evalModExp e m2) |
(ignore (evalModExp e m1); evalModExp e m2) |
214 |
in |
in |