|
|
1.1 ! root 1: (* Copyright 1989 by AT&T Bell Laboratories *) ! 2: signature STRS = ! 3: sig type strArg ! 4: type strtype type spectype ! 5: type functorFormal ! 6: type 'a pathstamped ! 7: type 'a susp ! 8: type functorActual ! 9: type symbol type structureVar type strb type signatureVar ! 10: type dec type Functor type functorVar type strexp type Structure ! 11: type signtype type fctb ! 12: val makeSTRBs: (symbol*structureVar*strb) list pathstamped ! 13: -> dec pathstamped ! 14: val makeSTRB: symbol * Structure option susp * strtype -> bool -> ! 15: (symbol * structureVar * strb) list pathstamped ! 16: val make_str_qid: symbol list -> strtype ! 17: val make_str_struct: dec list pathstamped -> strtype ! 18: val spread_args: dec list pathstamped -> functorActual ! 19: val single_arg: strtype -> functorActual ! 20: val make_str_app: symbol * functorActual -> strtype ! 21: val make_str_let: dec list pathstamped * strtype -> strtype ! 22: val make_sigb: symbol * signtype -> signatureVar list susp ! 23: val makeSIGdec: signatureVar list susp -> dec pathstamped ! 24: val single_formal: symbol * signtype -> functorFormal ! 25: val spread_formal: spectype -> functorFormal ! 26: val makeFCTB: symbol * functorFormal * Structure option susp * strtype -> ! 27: (symbol * functorVar * fctb) list susp ! 28: val makeFCTdec: (symbol * functorVar * fctb) list susp -> ! 29: dec pathstamped ! 30: val makeLOCALsdecs: dec list pathstamped * dec list pathstamped ! 31: -> dec list pathstamped ! 32: end ! 33: ! 34: structure Strs: STRS = ! 35: struct ! 36: ! 37: open ErrorMsg Symbol PrintUtil ! 38: open Access Basics BasicTypes TypesUtil Absyn ! 39: open Env ! 40: open EnvAccess ! 41: open ModUtil ! 42: open SigMatch ! 43: open Misc ! 44: ! 45: type stampsets = Stampset.stampsets ! 46: type 'a susp = unit -> 'a ! 47: type 'a pathstamped = symbol list * stampsets -> 'a ! 48: type signtype = Signs.signtype ! 49: type spectype = Signs.spectype ! 50: ! 51: type strArg = {abstract:bool,constraint: Structure option, ! 52: path:symbol list, param: Structure, ! 53: stamps:Stampset.stampsets} ! 54: type strtype = strArg -> strexp * Structure * thinning ! 55: ! 56: type functorFormal = (symbol * access * Structure * bool) susp ! 57: type functorActual = Functor * strArg -> strexp * Structure ! 58: fun makeSTRBs strb' $ = ! 59: STRdec(map (fn (name,strVar,strSyn) => (bindSTR(name,strVar); strSyn)) (strb' $)) ! 60: ! 61: fun makeSTRB(name,constraint,str) abstract ($ as (path,stamps)) = ! 62: case (constraint(),abstract) ! 63: of (NONE,true) => ! 64: (complain "abstraction requires a signature constraint"; ! 65: makeSTRB(name,fn()=>NONE,str) false $) ! 66: | (signopt,_) => ! 67: let val (strexp,str,thin)= ! 68: str{abstract=abstract,constraint=signopt,path=name::path, ! 69: param=NULLstr,stamps=stamps} ! 70: val strVar = STRvar{access=LVAR(namedLvar(name)), name=[name], ! 71: binding=str} ! 72: in [(name, strVar, ! 73: STRB{strvar=strVar, def=strexp, constraint=signopt, thin=thin})] ! 74: end ! 75: ! 76: fun make_str_qid qid ({abstract,path,stamps,constraint,...}:strArg) = ! 77: let val strVar as STRvar{binding,...} = lookPath(qid,lookSTRinStr) ! 78: in case constraint ! 79: of NONE => (VARstr strVar, binding, NONE) ! 80: | SOME sgn => ! 81: let val (str,thin) = ! 82: SigMatch.match(abstract,path,stamps,sgn,binding,param) ! 83: in (VARstr strVar, str, thin) ! 84: end ! 85: end ! 86: ! 87: fun make_str_struct sdecs ({abstract,path,param,stamps,constraint,...}:strArg) = ! 88: let val _ = openStr() ! 89: val body = sdecs(path,stamps) ! 90: in case constraint ! 91: of NONE => let val (thin,table) = BuildMod.buildStrTable () ! 92: in (STRUCTstr{body=body,locations=thin}, ! 93: mkSTR(path,table,DIR,stamps), ! 94: NONE) ! 95: end ! 96: | SOME sgn => let val (str,thin) = ! 97: SigMatch.realize(abstract,path,stamps, ! 98: Stampset.newStamp(#strStamps stamps), ! 99: sgn,param) ! 100: in closeStr(); ! 101: (STRUCTstr{body=body,locations=thin}, str, NONE) ! 102: end ! 103: end ! 104: ! 105: fun spread_args sdecs (_,({stamps,...}:strArg)) = ! 106: let val _ = openStr() ! 107: val body = sdecs([anonParamName],stamps) ! 108: val (thin,table) = BuildMod.buildStrTable () ! 109: in (STRUCTstr{body=body,locations=thin}, ! 110: mkSTR([anonParamName],table,DIR,stamps)) ! 111: end ! 112: ! 113: fun single_arg str (fct,({stamps,...}:strArg)) = ! 114: let val FUNCTOR{paramName,...} = fct ! 115: val (strexp,str,_) = str{abstract=false,constraint=NONE, ! 116: path=[paramName],param=NULLstr,stamps=stamps} ! 117: in (strexp,str) ! 118: end ! 119: ! 120: fun make_str_app (id,arg) (info as ({abstract,path,stamps,constraint,...}:strArg)) = ! 121: let val fctVar as FCTvar{binding=fct,...} = lookFCT id ! 122: val (argexp,argstr) = arg(fct,info) ! 123: val (result,thin1) = Functor.applyFunctor(fct,argstr,path,stamps) ! 124: val strexp = APPstr{oper=fctVar, argexp=argexp, argthin=thin1} ! 125: in case constraint ! 126: of NONE => (strexp,result,NONE) ! 127: | SOME sgn => ! 128: let val (thinned,thin2) = ! 129: SigMatch.match(abstract,path,stamps,sgn,result,param) ! 130: in (strexp,thinned,thin2) ! 131: end ! 132: end ! 133: ! 134: fun make_str_let (sdecs,str) (info as ({path,stamps,...}:strArg)) = ! 135: protect(protectScope,fn()=> ! 136: let val locals = sdecs(path,stamps) ! 137: val (bodyexp,bodystr,thin) = str info ! 138: in (LETstr(SEQdec locals, bodyexp),bodystr,thin) ! 139: end) ! 140: ! 141: fun make_sigb(name,sign) () = ! 142: let val sigvar = SIGvar{name=name,binding= sign(1,Stampset.newStampsets())} ! 143: in bindSIG(name, sigvar); [sigvar] ! 144: end ! 145: ! 146: fun makeSIGdec sigb ([],stamps) = SIGdec(sigb()) ! 147: | makeSIGdec sigb (path,stamps) = ! 148: (warn "signature found inside structure or functor"; ! 149: makeSIGdec sigb ([],stamps)) ! 150: ! 151: fun single_formal(name,sign) () = ! 152: let val senv = array(2, NULLstr) and tenv = array(0, NULLtyc) ! 153: val _ = openNew({path=[~1], strenv=REL{t=tenv,s=senv}}, newTable()) ! 154: val access = LVAR(namedLvar name) ! 155: val param = sign(1,Stampset.newStampsets()) ! 156: in update(senv,1,param); ! 157: bindSTR(name,STRvar{name=[name], access=access, binding=INDstr(1)}); ! 158: (name,access,param,false) ! 159: end ! 160: ! 161: fun spread_formal spec_s () = ! 162: let val plvar = namedLvar anonParamName ! 163: val param as STRstr{env,table,...} = ! 164: Signs.makeSIG spec_s (2,Stampset.newStampsets()) ! 165: in openOld({path=[~1,1],strenv=env},table); ! 166: (anonParamName,LVAR(plvar),param,true) ! 167: end ! 168: ! 169: fun makeFCTB(name,fparam,constraint_op,str) () = ! 170: let val mEntry = openScope() ! 171: val (pname,paccess,param,spreadParams) = fparam() ! 172: val resSign = constraint_op () ! 173: val _ = if spreadParams ! 174: then let val STRstr{table,env,...} = param ! 175: and LVAR plvar = paccess ! 176: in resetEnv(mEntry); ! 177: openOld({path=[plvar],strenv=env},table) ! 178: end ! 179: else () ! 180: val bodystamps = Stampset.newStampsets() ! 181: val (bodyexp,bodystr,thin) = ! 182: str{abstract=false,constraint=resSign,path=[], ! 183: stamps=bodystamps,param=param} ! 184: val openBody = case bodystr ! 185: of STRstr{stamp=bodystamp,env=DIR,...} => ! 186: Stampset.member(bodystamp,(#strStamps bodystamps)) ! 187: | _ => false ! 188: val paramVis = case resSign of SOME _ => true | NONE => openBody ! 189: val body = if openBody ! 190: then Functor.abstractBody(bodystr,param,bodystamps, ! 191: Stampset.newStamp(Stampset.sigStamps)) ! 192: else bodystr ! 193: val paramvar = STRvar{name=[pname], access=paccess, binding=param} ! 194: val fctv = FCTvar{name=name, ! 195: access=LVAR(namedLvar(name)), ! 196: binding=FUNCTOR{paramName=pname, param=param, ! 197: body=body, paramVis=paramVis, ! 198: stamps=bodystamps}} ! 199: val fb = FCTB{fctvar=fctv, param=paramvar, def=bodyexp, thin=thin, ! 200: constraint=resSign} ! 201: in resetEnv(mEntry); ! 202: [(name,fctv,fb)] ! 203: end ! 204: ! 205: fun makeFCTdec fctb ([],stamps) = ! 206: FCTdec(map (fn(name,fctVar,fctSyn)=>(bindFCT(name,fctVar); fctSyn)) (fctb())) ! 207: | makeFCTdec fctb (path,stamps) = ! 208: (warn "functor found inside structure or functor"; ! 209: makeFCTdec fctb ([],stamps)) ! 210: ! 211: fun makeLOCALsdecs(sdecs1,sdecs2) $ = ! 212: let val envLocal = openScope() ! 213: val ld1 = sdecs1 $ ! 214: val envIn = (openScope(); current()) ! 215: val ld2 = sdecs2 $ ! 216: in splice(envLocal,envIn); ! 217: [LOCALdec(SEQdec ld1, SEQdec ld2)] ! 218: end ! 219: ! 220: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.