Annotation of researchv10no/cmd/sml/src/parse/signs.sml, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: signature SIGNS = 
                      3: sig type spectype
                      4:     type signtype
                      5:     type symbol type 'a pathstamped type tyvar type ty type 'a susp
                      6:     type fixity type tycon
                      7:     val makeSIGid:     symbol -> signtype
                      8:     val makeSIG:       spectype -> signtype
                      9:     val make_includespec: symbol -> spectype
                     10:     val make_strspec:  symbol * signtype -> spectype
                     11:     val make_dtyspec:   tycon ref list pathstamped -> spectype
                     12:     val make_tyspec:   Basics.bool3 * tyvar list * symbol -> spectype
                     13:     val make_valspec:  symbol * ty susp -> spectype
                     14:     val make_exnspec:  symbol -> spectype
                     15:     val make_exnspecOF:        symbol * ty susp-> spectype
                     16:     val make_fixityspec: fixity * symbol list -> spectype
                     17:     val make_type_sharespec: symbol list list -> spectype
                     18:     val make_str_sharespec: symbol list list -> spectype
                     19: end
                     20: 
                     21: structure Signs : SIGNS = struct
                     22: 
                     23:   open ErrorMsg Symbol PrintUtil
                     24:   open Access Basics BasicTypes TypesUtil Absyn
                     25:   open Env
                     26:   open EnvAccess
                     27:   open ModUtil
                     28:   open SigMatch
                     29:   open Misc
                     30: (*   open CoreLang *)
                     31: 
                     32: type signContext = {stamps: Stampset.stampsets, nextSlot: unit->int,
                     33:                    sNext: Structure->Structure, tNext: tycon->tycon,
                     34:                    sCount: int ref, tCount: int ref,
                     35:                    tempenv: strenv, depth: int,
                     36:                    typeSharing: spath list list ref,
                     37:                    strSharing: spath list list ref}
                     38: 
                     39: type stampsets = Stampset.stampsets
                     40: type 'a stamped = stampsets -> 'a
                     41: type 'a pathstamped = symbol list * stampsets -> 'a
                     42: type 'a susp = unit -> 'a
                     43: type spectype = signContext -> binding list 
                     44: type signtype = int * stampsets -> Structure
                     45:                    
                     46: fun includeSig({nextSlot,sNext,tNext,sCount,tCount,...}: signContext,
                     47:               {strStamps=strStamps0, tycStamps=tycStamps0}: stampsets,
                     48:               STRstr{kind=SIGkind{bindings,stamps={strStamps,tycStamps},...},
                     49:                      env=REL{s=senv,t=tenv},...}) =
                     50:     let val transStrStamp = Stampset.join(strStamps0,strStamps)
                     51:        val transTycStamp = Stampset.join(tycStamps0,tycStamps)
                     52:        val sOffset = !sCount - 2 (* offset for structure indices *)
                     53:        val tOffset = !tCount     (* offset for tycon indices *)
                     54: 
                     55:        (* adjustPath(depth: int, path: int list) *)
                     56:        fun adjustPath(0,[i]) = [i+tOffset]
                     57:          | adjustPath(0,i::r) = (i+sOffset) :: r
                     58:          | adjustPath(0,[]) = impossible "sigBody.includeSig.adjustPath"
                     59:          | adjustPath(d,0::(r as _::_)) = 0 :: adjustPath(d-1,r)
                     60:          | adjustPath(d,p) = p
                     61: 
                     62:        fun adjustType(depth,ty) =
                     63:            let fun adjust(CONty(ref(RELtyc(p)),args)) =
                     64:                      CONty(ref(RELtyc(adjustPath(depth,p))), map adjust args)
                     65:                  | adjust(CONty(reftyc,args)) =
                     66:                      CONty(reftyc, map adjust args)
                     67:                  | adjust(POLYty{sign,tyfun=TYFUN{arity,body}}) =
                     68:                      POLYty{sign=sign,
                     69:                             tyfun=TYFUN{arity=arity,body=adjust body}}
                     70:                  | adjust ty = ty
                     71:             in adjust ty
                     72:            end
                     73: 
                     74:        fun transTBinding depth binding =
                     75:            case binding
                     76:             of VARbind(VALvar{name,typ,access}) =>
                     77:                  VARbind(VALvar{name=name,access=access,
                     78:                                 typ=ref(adjustType(depth,!typ))})
                     79:              | CONbind(DATACON{name,typ,const,rep,sign}) =>
                     80:                  CONbind(DATACON{name=name, const=const, sign=sign, rep=rep,
                     81:                                  typ=ref(adjustType(depth,!typ))})
                     82:              | _ => binding
                     83: 
                     84:        fun transLBinding table binding =
                     85:            case binding
                     86:             of VARbind(VALvar{name=[n],typ,access}) =>
                     87:                  IntStrMap.map table (NameSpace.varKey n)
                     88:              | CONbind(DATACON{name,typ,const,rep,sign}) =>
                     89:                  IntStrMap.map table (NameSpace.conKey name)
                     90:              | _ => binding
                     91: 
                     92:        fun newTyc(tyc as TYCON{stamp,kind,...}) =
                     93:            if Stampset.tycFixed(stamp)
                     94:            then tyc
                     95:            else (case kind
                     96:                   of ABStyc => setTycStamp(transTycStamp(stamp),tyc)
                     97:                    | DATAtyc _ => setTycStamp(transTycStamp(stamp),tyc)
                     98:                    | _ => tyc)
                     99:          | newTyc _ = impossible "Parse.includeSig.newTyc"
                    100: 
                    101:        fun newEnv(depth,REL{s,t}) =
                    102:             REL{s=mapSubstrs(newStr depth,s), t=ArrayExt.map(newTyc,t,0)}
                    103:          | newEnv _ = impossible "Parse.includeSig.newEnv"
                    104: 
                    105:        and newStr depth (str as STRstr{stamp,sign,table,env,
                    106:                                        kind=SIGkind{stamps,share,bindings}}) =
                    107:            if Stampset.strFixed(stamp)
                    108:            then str
                    109:            else let val newenv as REL{s,t} = newEnv(depth+1,env)
                    110:                     val newtable =
                    111:                         IntStrMap.transform (transTBinding depth) table
                    112:                     val new =
                    113:                         STRstr{stamp=transStrStamp(stamp),
                    114:                                table=newtable,
                    115:                                kind=SIGkind{stamps=stamps,share=share,
                    116:                                             bindings=map
                    117:                                                      (transLBinding newtable)
                    118:                                                      bindings},
                    119:                                      env=newenv, sign=sign}
                    120:                  in ArrayExt.app(ModUtil.resetParent new, s, 2);
                    121:                     new
                    122:                 end
                    123:          | newStr _ (INDstr i) = impossible("sigbody.newStr INDstr "^
                    124:                                           makestring i)
                    125:          | newStr _ (SHRstr _) = impossible "sigbody.newStr SHRstr"
                    126:          | newStr _ (NULLstr) = impossible "sigbody.newStr NULLstr"
                    127:          | newStr _ _ = impossible "sigbody.newStr STRkind"
                    128: 
                    129:        fun adjustBinding binding =
                    130:            case binding
                    131:             of VARbind(VALvar{name=[n],typ,...}) =>
                    132:                  bindVAR(n,VALvar{name=[n],typ=ref(adjustType(0,!typ)),
                    133:                                   access=SLOT(nextSlot())})
                    134:              | CONbind(DATACON{name,typ,const,rep as VARIABLE(SLOT _),sign}) =>
                    135:                  bindCON(name,DATACON{name=name,
                    136:                                       const=const,
                    137:                                       sign=sign,
                    138:                                       typ=ref(adjustType(0,!typ)),
                    139:                                       rep=VARIABLE(SLOT(nextSlot()))})
                    140:              | CONbind(DATACON{name,typ,const,rep,sign}) =>
                    141:                  bindCON(name,DATACON{name=name,
                    142:                                       const=const,
                    143:                                       sign=sign,
                    144:                                       typ=ref(adjustType(0,!typ)),
                    145:                                       rep=rep})
                    146:              | TYCbind(ref(INDtyc i)) =>
                    147:                  let val tyc = tenv sub i
                    148:                      val name = tycName tyc
                    149:                   in bindTYC(name,ref(tNext(newTyc(tyc))))
                    150:                  end
                    151:              | STRbind(STRvar{name as [n],binding=INDstr i,...}) =>
                    152:                  bindSTR(n,STRvar{name=name,
                    153:                                   binding=sNext(newStr 1 (senv sub i)),
                    154:                                   access=SLOT(nextSlot())})
                    155:              | FIXbind(fixvar as FIXvar{name,...}) =>
                    156:                  bindFIX(name,fixvar)
                    157:              | _ => impossible "sigBody.adjustBinding"
                    158: 
                    159:      in map adjustBinding bindings
                    160:     end (* includeSig *)
                    161:   | includeSig _ = impossible "Parse.includeSig - bad arg"
                    162: 
                    163: 
                    164: fun makeSIGid ID (depth,stamps) =
                    165:     let val SIGvar{binding,...}=lookSIG ID
                    166:      in if depth>0 then ModUtil.shiftSigStamps(stamps,binding) else binding
                    167:     end
                    168:  
                    169: val maxTypSpecs = 100  (*maximum number of type specs in a signature *)
                    170: val maxStrSpecs = 100  (*maximum number of structure specs in a signature *)
                    171: 
                    172: fun makeSIG(specs) (depth,stamps) = 
                    173:  let val tComps = array(maxTypSpecs,NULLtyc)
                    174:      and tCount = ref 0
                    175:      fun tNext x = (update(tComps,!tCount,x);
                    176:                    INDtyc(!tCount before inc tCount))
                    177:      val sComps = array(maxStrSpecs,NULLstr)
                    178:      and sCount = ref 2 (* slots 0,1 reserved for parent, fct param (if any) *)
                    179:      fun sNext x = (update(sComps,!sCount,x);
                    180:                    INDstr(!sCount before inc sCount))
                    181:      val tempenv = REL{t=tComps,s=sComps}
                    182:      fun pairs (nil : spath list list) : (spath*spath) list = nil
                    183:        | pairs ((a::b::r) :: s) = (a,b) :: pairs((b::r) :: s)
                    184:        | pairs ( _ :: s ) = pairs s
                    185:      val strSharing : spath list list ref = ref nil
                    186:      val typeSharing : spath list list ref = ref nil
                    187: 
                    188:      val slot = ref 0
                    189:      fun nextSlot() = (!slot before inc slot)
                    190: 
                    191:      val signContext : signContext =
                    192:                {stamps=stamps,nextSlot=nextSlot, tempenv=tempenv,
                    193:                 sNext=sNext,tNext=tNext, depth=depth,
                    194:                 sCount=sCount,tCount=tCount,
                    195:                 typeSharing=typeSharing,strSharing=strSharing}
                    196: 
                    197:      val stamp = Stampset.newStamp(#strStamps stamps)
                    198:      val _ = openStr()   (* this is out of date, check parse.sml *)
                    199:      val table = newTable()
                    200:      val _ = openNew({path=[~depth],strenv=tempenv},table)
                    201:      val savedlookArTYC = !lookArTYC
                    202:      val savedlookPathArTYC = !lookPathArTYC
                    203:      val bindings = protect(
                    204:         ((fn () => (lookArTYC := lookArTYCinSig depth;
                    205:                     lookPathArTYC :=
                    206:                       lookPathArTYCinSig depth)),
                    207:          (fn () => (lookArTYC := savedlookArTYC;
                    208:                     lookPathArTYC := savedlookPathArTYC))),
                    209:          fn() => specs signContext)
                    210:      val _ = closeStr()
                    211:      val senv = ArrayExt.copy(sComps,!sCount)
                    212:      val env = REL{s=senv, t=ArrayExt.copy(tComps,!tCount)}
                    213:      val sShare = pairs(!strSharing)
                    214:      val tShare = pairs(!typeSharing)
                    215:      val shareSpec =
                    216:            if null sShare andalso null tShare
                    217:            then {s=[],t=[]}
                    218:            else Sharing.doSharing(table,env,stamps,{s=sShare,t=tShare})
                    219:      val result =
                    220:            STRstr{stamp=stamp,
                    221:             sign=Stampset.newStamp(Stampset.sigStamps),
                    222:             table=table,
                    223:             env=env,
                    224:             kind=SIGkind{share=shareSpec,
                    225:                          bindings=bindings,
                    226:                          stamps=stamps}}
                    227:   in ArrayExt.app((ModUtil.setParent result),senv,2);
                    228:      result
                    229:  end
                    230: 
                    231: 
                    232: fun make_includespec name ($ as {stamps,...}:signContext) =
                    233:   let val SIGvar{binding,...} = lookSIG name in includeSig($,stamps,binding) end
                    234: 
                    235: fun make_strspec(name,sign) ({depth,stamps,nextSlot,sNext,...}:signContext) =
                    236:   let val sgn = sign(depth+1,stamps)
                    237:    in [bindSTR(name,STRvar{name=[name],access=SLOT(nextSlot()),
                    238:                                    binding=sNext(sgn)})]
                    239:   end
                    240: 
                    241: fun make_dtyspec db ({stamps,tempenv,tNext,...}:signContext) =
                    242:     let val dtycs =
                    243:         (protect(protectDb(), fn() =>
                    244:              map (fn (r as ref tyc) => 
                    245:                    (r := tNext tyc; (TYCbind r, tyc)))
                    246:                (db1(ty,[],stamps))))
                    247:        val tycbinds = map (fn (x,_) => x) dtycs
                    248:        val tycons = map (fn (_,y) => y) dtycs
                    249:        fun collectdcons(tyc::rest,dcbinds) =
                    250:             let val TYCON{kind=DATAtyc(dcons),...} = tyc
                    251:                 fun binddcons(DATACON{name,...}::rest',dcbs) =
                    252:                      binddcons(rest',
                    253:                           (let val (b,_) = Env.look(NameSpace.conKey(name))
                    254:                             in b::dcbs
                    255:                            end
                    256:                            handle Unbound => dcbs))
                    257:                   | binddcons([],dcbs) = dcbs
                    258:              in collectdcons(rest,binddcons(dcons,dcbinds))
                    259:             end
                    260:          | collectdcons([],dcbinds) = dcbinds
                    261:      in app (defineEqTycon (tyconInContext tempenv)) tycons;
                    262:        tycbinds @ collectdcons(tycons,[])
                    263:     end
                    264: 
                    265: fun make_tyspec(eq,tyvars,name) ({stamps,tNext,...}:signContext) =
                    266:      [bindTYC(name, ref(tNext(mkABStyc([name],length tyvars,eq,stamps))))]
                    267: 
                    268: fun make_valspec(name,ty) ({nextSlot,...}:signContext) =
                    269:    let val typ = protect(protectScope, fn () =>
                    270:                      protect(protectTyvars NONE, fn () =>
                    271:                        let val body = ty()
                    272:                            val tvs = currentTyvars()
                    273:                         in case tvs
                    274:                              of [] => body
                    275:                               | _ =>
                    276:                                 let val sign = TypesUtil.bindTyvars1 tvs
                    277:                                  in POLYty
                    278:                                      {sign = sign,
                    279:                                       tyfun = TYFUN{arity = length tvs, 
                    280:                                                     body = body}}
                    281:                                 end
                    282:                        end))
                    283:    in [bindVAR(name,VALvar{name=[name],typ=ref typ,access=SLOT(nextSlot())})]
                    284:   end
                    285: 
                    286: fun make_exnspec name ({nextSlot,...}:signContext) =
                    287:   [bindCON(name,DATACON{name=name,const=true,typ=ref exnTy,sign=[],
                    288:                rep=VARIABLE(SLOT(nextSlot()))})]
                    289: 
                    290: fun make_exnspecOF(name,ty) ({nextSlot,...}:signContext) =
                    291:   let val typ = protect(protectScope, fn()=>
                    292:                  protect(protectTyvars NONE, fn()=>
                    293:                        let val body = ty()
                    294:                            val tvs = currentTyvars()
                    295:                         in case length tvs
                    296:                             of 0 => body --> exnTy
                    297:                              | n => (TypesUtil.bindTyvars tvs;
                    298:                                      POLYty{sign = mkPolySign n,
                    299:                                         tyfun = TYFUN{arity = n,
                    300:                                                     body = body --> exnTy}})
                    301:                           end))
                    302:    in [bindCON(name, DATACON{name=name, const=false, typ= ref typ,sign=[],
                    303:                                      rep=VARIABLE(SLOT(nextSlot()))})]
                    304:   end
                    305: 
                    306: fun make_fixityspec(fixity,ops) _ = 
                    307:   (app(fn i => bindFIX(i,FIXvar{name=i,binding=fixity})) ops;  nil)
                    308: 
                    309: fun make_type_sharespec patheqn ({typeSharing,...}:signContext) =
                    310:                (typeSharing := patheqn :: !typeSharing; nil)
                    311: 
                    312: fun make_str_sharespec patheqn ({strSharing,...}:signContext) =
                    313:                (strSharing := patheqn :: !strSharing; nil)
                    314: end

unix.superglobalmegacorp.com

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