Annotation of researchv10no/cmd/sml/src/env/buildmod.sml, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: (* buildmod.sml *)
                      3: 
                      4: (* building structures *)
                      5: 
                      6: structure BuildMod : BUILDMOD =
                      7: struct
                      8: 
                      9: open ErrorMsg Symbol Access Basics TypesUtil Env NameSpace
                     10: 
                     11: (* ordering of binders -- comparing by bound symbol for runtime components *)
                     12: fun binderGt(bind1: binder, bind2: binder) =
                     13:     case (bind1,bind2)
                     14:       of ((ind1,_,FIXbind(_)),(ind2,_,FIXbind(_))) => ind1 > ind2
                     15:        | ((_,_,FIXbind(_)),_) => true
                     16:        | (_,(_,_,FIXbind(_))) => false
                     17:        | ((_,n1,VARbind(_)),(_,n2,VARbind(_))) => n1 > n2
                     18:        | ((_,_,VARbind(_)),_) => true
                     19:        | (_,(_,_,VARbind(_))) => false
                     20:        | ((_,n1,CONbind(_)),(_,n2,CONbind(_))) => n1 > n2
                     21:        | ((_,_,CONbind(_)),_) => true
                     22:        | (_,(_,_,CONbind(_))) => false
                     23:        | ((ind1,_,TYCbind(_)),(ind2,_,TYCbind(_))) => ind1 > ind2
                     24:        | ((_,_,TYCbind(_)),_) => true
                     25:        | (_,(_,_,TYCbind(_))) => false
                     26:        | ((_,n1,STRbind(_)),(_,n2,STRbind(_))) => n1 > n2
                     27:        | ((_,_,STRbind(_)),_) => true
                     28:        | (_,(_,_,STRbind(_))) => false
                     29:        | ((ind1,_,FCTbind(_)),(ind2,_,FCTbind(_))) => ind1 > ind2
                     30:        | ((_,_,FCTbind(_)),_) => true
                     31:        | (_,(_,_,FCTbind(_))) => false
                     32:        | ((ind1,_,SIGbind(_)),(ind2,_,SIGbind(_))) => ind1 > ind2
                     33:        | _ => impossible "EnvAccess.binderGt"
                     34: 
                     35: fun extendPath(LVAR(v): access, []: path) = PATH[v] (* locally defined *)
                     36:   | extendPath(SLOT(n), p) = PATH(n::p)  (* element of opened structure *)
                     37:   | extendPath(x as PATH _, _) = x  (* defined exception *)
                     38:   | extendPath(x as INLINE _, _) = x
                     39:   | extendPath(access,path) = impossible "extendPath in envaccess"
                     40: 
                     41: fun dconInStr(dc as DATACON{name,const,typ,rep,sign},env,slotNo) : datacon =
                     42:     DATACON{name = name, const = const, sign = sign,
                     43:             rep = (case rep
                     44:                     of VARIABLE(access) => VARIABLE(SLOT slotNo)
                     45:                      | _ => rep),
                     46:             typ = ref(typeInContext(!typ,env))}
                     47: 
                     48: fun last (x as [_]) = x | last(a::b) = last b | last [] = impossible "last"
                     49: 
                     50: fun buildStrTable () : trans list * symtable =
                     51:     let val newtable = newTable()
                     52:        val add = IntStrMap.add newtable
                     53:        val look = IntStrMap.map newtable
                     54:        fun getBindings() =
                     55:            (* no sorting done, except chronological by collectTable *)
                     56:            let val r = ref (nil : (binder * info) list)
                     57:                fun add x = r := x :: !r
                     58:             in collectTable add;
                     59:                !r
                     60:            end
                     61:        fun fill (nil,count) = nil
                     62:          | fill ((bdg as (i,s,binding),{path,strenv})::rest,count) =
                     63:               (look(i,s); fill(rest,count)) handle UnboundTable =>     
                     64:             case binding
                     65:              of VARbind(var as VALvar{access,name,typ}) =>
                     66:                   (add(i,s,
                     67:                        VARbind(
                     68:                          case access
                     69:                           of INLINE(_) => var
                     70:                            | _ =>
                     71:                                VALvar{access = SLOT count,
                     72:                                       typ = ref(typeInContext(!typ,strenv)),
                     73:                                       name = last name}));
                     74:                    VALtrans(extendPath(access,path))::fill(rest,count+1))
                     75:               | CONbind(exn as DATACON{rep=VARIABLE(access),...}) =>
                     76:                   (add(i,s,CONbind(dconInStr(exn,strenv,count)));
                     77:                    VALtrans(extendPath(access,path))::fill(rest,count+1))
                     78:               | STRbind(STRvar{name,access,binding}) =>
                     79:                   let val newbinding =
                     80:                           case binding
                     81:                            of INDstr i =>
                     82:                               (case strenv
                     83:                                 of REL{s=senv,...} => senv sub i
                     84:                                  | DIR => impossible "buildStrTable.fill 1")
                     85:                             | SHRstr(i::r) =>
                     86:                               (case strenv
                     87:                                 of REL{s=senv,...} => getEpath(r,senv sub i)
                     88:                                  | DIR => impossible "buildStrTable.fill 2")
                     89:                             | _ => binding
                     90:                    in add(i,s, STRbind(STRvar{name=last name,
                     91:                                               binding=newbinding,
                     92:                                               access=SLOT(count)}));
                     93:                       VALtrans(extendPath(access,path))::fill(rest,count+1)
                     94:                   end
                     95:               | TYCbind(tyconRef) =>
                     96:                   (add(i,s,TYCbind(ref(tyconInContext strenv (!tyconRef))));
                     97:                    fill(rest,count))
                     98:               | CONbind(dcon) =>
                     99:                   (add(i,s,CONbind(dconInStr(dcon,strenv,0)));
                    100:                    fill(rest,count))
                    101:               | _ => (add bdg; fill(rest,count))
                    102:      in (fill(getBindings(),0), newtable)
                    103:     end
                    104: 
                    105: end (* structure BuildMod *)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.