Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/vis12/src/compiler/env/env.sml
ViewVC logotype

Annotation of /branches/vis12/src/compiler/env/env.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2211 - (view) (download)

1 : jhr 71 (* env.sml
2 :     *
3 : jhr 435 * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 : jhr 71 * All rights reserved.
5 :     *)
6 :    
7 :     structure Env : sig
8 :    
9 :     type env
10 :    
11 : jhr 78 val new : unit -> env
12 :    
13 : jhr 2133 (* functions are either user-defined or pre-defined *)
14 :     datatype fun_def
15 : jhr 2153 = PrimFun of AST.var list (* possibly overloaded builtin function *)
16 :     | UserFun of AST.var (* user-defined function *)
17 : jhr 169
18 : jhr 2211 val findStrand : env * Atom.atom -> AST.strand option
19 : jhr 2133 val findFunc : env * Atom.atom -> fun_def
20 : jhr 71 val findVar : env * Atom.atom -> AST.var option
21 :    
22 : jhr 2211 val insertStrand : env * AST.strand -> env
23 :    
24 : jhr 169 (* insert a function binding *)
25 : jhr 2133 val insertFunc : env * Atom.atom * fun_def -> env
26 : jhr 169
27 :     (* insert variable bindings *)
28 : jhr 78 val insertGlobal : env * Atom.atom * AST.var -> env
29 :     val insertLocal : env * Atom.atom * AST.var -> env
30 :    
31 : jhr 71 end = struct
32 :    
33 :     structure ATbl = AtomTable
34 :     structure AMap = AtomMap
35 :    
36 : jhr 2133 (* functions are either user-defined or pre-defined *)
37 :     datatype fun_def
38 :     = PrimFun of AST.var list (* possibly overloaded builtin function *)
39 :     | UserFun of AST.var (* user-defined function *)
40 :    
41 : jhr 511 (* global environment holds global variables and strands *)
42 : jhr 71 datatype global_env = GE of {
43 : jhr 2211 sEnv : AST.strand ATbl.hash_table, (* strands *)
44 :     fEnv : fun_def ATbl.hash_table, (* functions, which may be overloaded *)
45 : jhr 169 vEnv : AST.var ATbl.hash_table (* global variable bindings *)
46 : jhr 71 }
47 :    
48 :     datatype env = E of {
49 :     g : global_env,
50 :     vEnv : AST.var AMap.map
51 :     }
52 :    
53 : jhr 78 fun new () = E{
54 : jhr 169 g = GE{
55 : jhr 2211 sEnv = ATbl.mkTable(8, Fail "strand env"),
56 : jhr 169 fEnv = ATbl.mkTable(128, Fail "global function env"),
57 :     vEnv = ATbl.mkTable(128, Fail "global variable env")
58 :     },
59 : jhr 78 vEnv = AMap.empty
60 :     }
61 :    
62 : jhr 2211 fun findStrand (E{g=GE{sEnv, ...}, ...}, s) = ATbl.find sEnv s
63 :    
64 : jhr 1116 fun findFunc (E{g=GE{fEnv, ...}, ...}, x) = (case ATbl.find fEnv x
65 : jhr 2133 of NONE => PrimFun[]
66 :     | SOME fdef => fdef
67 : jhr 1116 (* end case *))
68 : jhr 169
69 : jhr 71 fun findVar (E{g=GE{vEnv=gvEnv, ...}, vEnv}, x) = (case AMap.find(vEnv, x)
70 :     of NONE => ATbl.find gvEnv x
71 :     | someVar => someVar
72 :     (* end case *))
73 :    
74 : jhr 2211 fun insertStrand (env as E{g=GE{sEnv, ...}, ...}, s as AST.Strand{name, ...}) = (
75 :     ATbl.insert sEnv (name, s);
76 :     env)
77 :    
78 : jhr 169 fun insertFunc (env as E{g=GE{fEnv, ...}, ...}, f, f') = (
79 :     ATbl.insert fEnv (f, f');
80 :     env)
81 :    
82 : jhr 78 fun insertGlobal (env as E{g=GE{vEnv, ...}, ...}, x, x') = (
83 :     ATbl.insert vEnv (x, x');
84 :     env)
85 : jhr 71
86 : jhr 72 fun insertLocal (env as E{vEnv, g}, x, x') =
87 : jhr 75 E{vEnv = AMap.insert(vEnv, x, x'), g = g}
88 : jhr 72
89 : jhr 71 end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0