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

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

unix.superglobalmegacorp.com

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