Annotation of researchv10no/cmd/sml/src/translate/translate.sml, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: signature TRANSLATE = sig
        !             3:        val transDec : Absyn.dec -> Lambda.lexp -> Lambda.lexp
        !             4: end
        !             5: 
        !             6: structure Translate : TRANSLATE =
        !             7: struct
        !             8: open Access Absyn Lambda Basics BasicTypes Nonrec ErrorMsg Unboxed
        !             9: 
        !            10: val unitLexp = RECORD []
        !            11: 
        !            12: fun composeNOT (x) =  
        !            13:     let val v = mkLvar()
        !            14:     in FN(v,SWITCH(APP(x, VAR v),
        !            15:                    [(DATAcon falseDcon, CON(trueDcon,unitLexp)),
        !            16:                    (DATAcon trueDcon, CON(falseDcon,unitLexp))],NONE))
        !            17:     end
        !            18: 
        !            19: val elemgtr = (fn ((LABEL{number=x,...},_),(LABEL{number=y,...},_))=> x>y);
        !            20: val sorted = Sort.sorted elemgtr
        !            21: val sortrec = Sort.sort elemgtr
        !            22:                
        !            23: val [bogusID,matchsym,bindsym] = map Symbol.symbol ["bogus","Match","Bind"]
        !            24: 
        !            25: fun raisematch() = (WILDpat,RAISE(CON(!CoreInfo.exnMatch,unitLexp)))
        !            26: 
        !            27: fun reraise() =
        !            28:     let val v = mkLvar()
        !            29:     in (VARpat(VALvar{name=[bogusID],access=LVAR v, typ=ref UNDEFty}), RAISE(VAR v))
        !            30:     end
        !            31: 
        !            32: val printDepth = System.Control.Print.printDepth
        !            33: 
        !            34: fun translatepath [v] = VAR v
        !            35:   | translatepath (x::p) = SELECT(x,translatepath p)
        !            36:   | translatepath nil = impossible "translate.translatepath nil"
        !            37: 
        !            38: fun fill (APPpat(_,p)) = fill p
        !            39:   | fill (CONSTRAINTpat (p,_)) = fill p
        !            40:   | fill (LAYEREDpat (p,q)) = (fill p; fill q)
        !            41:   | fill (RECORDpat {pats = ref (_::_),...}) = ()
        !            42:   | fill (RECORDpat {fields,flex=false,pats,...}) =
        !            43:         pats := map (fn (_,p) => (fill p; p)) fields
        !            44:   | fill (pat as RECORDpat {fields,flex=true,typ,pats}) =
        !            45:        (app (fn (_,p) => fill p) fields;
        !            46:         let fun find (FLEXRECORDty(ref(CLOSED ty))) = find(ty)
        !            47:               | find (t as CONty(ref(TYCON{kind=RECORDtyc labels,...}),_)) = 
        !            48:                                (typ := t; labels)
        !            49:               | find _ = (PrintAbsyn.printPat(pat,!printDepth);
        !            50:                           condemn "unresolved flexible record")
        !            51:             fun merge (a as ((id,p)::r), lab::s) =
        !            52:                   if Symbol.eq(id,lab) then p :: merge(r,s) 
        !            53:                   else WILDpat :: merge(a,s)
        !            54:                | merge (nil, lab::s) = WILDpat :: merge(nil,s)
        !            55:               | merge (nil,nil) = nil
        !            56:               | merge _ = impossible "merge in translate"
        !            57:           in pats := (merge(fields, find(!typ)) handle Syntax => [WILDpat])
        !            58:          end)
        !            59:   | fill _ = ()
        !            60: 
        !            61: fun polyequal() = translatepath(!CoreInfo.polyequalPath)
        !            62: 
        !            63: fun getEqualElem (CONty(_,[CONty(_,[t,_]),_])) = t
        !            64:   | getEqualElem _ = VARty(ref(IBOUND 0))
        !            65: 
        !            66: fun thinStr(e,NONE) = e
        !            67:   | thinStr(e,SOME(v,locs)) = APP(FN(v,RECORD(map transLoc locs)), e)
        !            68: 
        !            69: and transLoc trans =
        !            70:  case trans
        !            71:    of VALtrans(PATH p) => translatepath p
        !            72:     | VALtrans(INLINE P.eql) => polyequal()
        !            73:     | VALtrans(INLINE P.neq) => composeNOT(polyequal())
        !            74:     | VALtrans(INLINE i) => PRIM i
        !            75:     | THINtrans(PATH p,v,locs) => thinStr(translatepath p, SOME(v,locs))
        !            76:     | CONtrans(d as DATACON{const=true,...}) => CON(d, unitLexp)
        !            77:     | CONtrans(d as DATACON{const=false,...}) => 
        !            78:         let val v = mkLvar() in FN(v,CON(d, VAR v)) end
        !            79:     | _ => impossible "transLoc in translate"
        !            80: 
        !            81: 
        !            82: 
        !            83: fun transStr (VARstr(STRvar{access=PATH(path),...})) = translatepath path
        !            84:   | transStr (STRUCTstr{body,locations}) = 
        !            85:                makedec (SEQdec body) (RECORD(map transLoc locations))
        !            86:   | transStr (APPstr{oper=FCTvar{access=LVAR(v),...},argexp,argthin}) =
        !            87:              APP(VAR v, thinStr(transStr argexp, argthin))
        !            88:   | transStr (LETstr(d,body)) = makedec d (transStr body)
        !            89:   | transStr _ = impossible "Translate.transStr"
        !            90: 
        !            91: and makedec (VALdec vbl) =
        !            92:     fold (fn (VB{pat=VARpat(VALvar{access=INLINE(_),...}),...},b) => b
        !            93:           | (VB{pat=CONSTRAINTpat(VARpat(VALvar{access=INLINE _,...}),_),
        !            94:                    exp=_,...},b) => b
        !            95:           | (VB{pat=VARpat(VALvar{access=LVAR v,...}),exp,...},b) => 
        !            96:                APP(FN(v,b), translate exp)
        !            97:           | (VB{pat,exp,...},b) => 
        !            98:              (fill pat; 
        !            99:               APP(MC.bindCompile 
        !           100:                   [(pat,b),(WILDpat,RAISE(CON(!CoreInfo.exnBind,unitLexp)))],
        !           101:                   translate exp)))
        !           102:         vbl
        !           103:   | makedec (a as VALRECdec rvbl) =
        !           104:       (makedec (nonrec a)
        !           105:        handle Isrec =>
        !           106:        (fn e => FIX(fold
        !           107:         (fn (RVB{var=VALvar{access=LVAR(var),...},exp,...}, (vlist,llist,lexp))
        !           108:               => (var::vlist,  translate exp :: llist,  lexp)
        !           109:           | _ => impossible "#73 in translate")
        !           110:         rvbl (nil,nil,e))))
        !           111:   | makedec (LOCALdec(localdec,visibledec)) = 
        !           112:           makedec(SEQdec[localdec,visibledec])
        !           113: 
        !           114:   | makedec (EXCEPTIONdec ebl) =
        !           115:       fold(fn (EBgen{exn=DATACON{rep=VARIABLE(LVAR v),name,const,...},...},lexp)=>
        !           116:                APP(FN(v,lexp),
        !           117:                    if const
        !           118:                    then RECORD[unitLexp,CON(refDcon,STRING (Symbol.name name))]
        !           119:                    else CON(refDcon,STRING (Symbol.name name)))
        !           120:            | (EBdef{exn=DATACON{rep=VARIABLE(LVAR v),...},
        !           121:                     edef=DATACON{rep=VARIABLE(PATH p),...}},
        !           122:               lexp) => APP(FN(v,lexp),translatepath p)
        !           123:            | _ => impossible "in makedec EXCEPTIONdec")
        !           124:          ebl
        !           125: 
        !           126:   | makedec (SEQdec decl) =
        !           127:      (* fold (fn (dec,exp) => makedec dec exp) decl *)
        !           128:       let fun f(a::r) = (makedec a) o (f r) | f nil = (fn e=>e) in f decl end
        !           129: 
        !           130:   | makedec (DATATYPEdec _) = (fn e => e)
        !           131:   | makedec (ABSTYPEdec{body,...}) = makedec body
        !           132:   | makedec (TYPEdec _) = (fn e => e)
        !           133:   | makedec (STRdec sbl) =
        !           134:       fold(fn (STRB{strvar=STRvar{access=LVAR(v),...},def,thin,...},lexp) =>
        !           135:              APP(FN(v,lexp),thinStr(transStr def, thin))
        !           136:            | _ => impossible "makedec(STRdec) in translate")
        !           137:          sbl
        !           138:   | makedec (ABSdec sbl) = makedec(STRdec sbl)
        !           139:   | makedec (FCTdec fbl) =
        !           140:       fold(fn (FCTB{fctvar=FCTvar{access=LVAR(v),binding,...},def,thin,
        !           141:                    param=STRvar{access=LVAR p,...},...},
        !           142:               lexp) =>
        !           143:               APP(FN(v,lexp),FN(p,thinStr(transStr def, thin)))
        !           144:            | _ => impossible "makedec(FCTdec) in translate")
        !           145:          fbl
        !           146:   | makedec (SIGdec _) = (fn e => e)
        !           147:   | makedec (OPENdec _) = (fn e => e)
        !           148:   | makedec (MARKdec(dec,a,b)) = makedec dec
        !           149: 
        !           150: and transrules rules = map (fn (RULE(p,e)) => ((fill p; p), translate e)) rules
        !           151: 
        !           152: and translate exp =
        !           153:   case exp 
        !           154:    of  INTexp i => INT i
        !           155:      | REALexp r => REAL r
        !           156:      | STRINGexp s => STRING s
        !           157:      | RECORDexp l =>
        !           158:        if sorted l
        !           159:        then RECORD(map (fn(_,e)=>translate e) l)
        !           160:        else let val vars = map (fn (l,e) => (l,(e,mkLvar()))) l
        !           161:                 fun bind ((_,(e,v)), x) = APP(FN(v, x), translate e)
        !           162:             in fold bind vars (RECORD(map (fn(_,(_,v))=>VAR v) (sortrec vars)))
        !           163:             end
        !           164:     | SEQexp [e] => translate e
        !           165:     | SEQexp (e::r) => APP(FN(mkLvar(), translate(SEQexp r)), translate e)
        !           166:     | APPexp(CONexp dcon, e) => CON (dcon, translate e)
        !           167:     | MARKexp(e,_,_) => translate e
        !           168:     | CONexp(dcon as DATACON{const=false,...}) =>
        !           169:        let val v = mkLvar () in FN(v,CON (dcon, VAR v)) end
        !           170:     | CONexp (dcon as DATACON{const=true,...}) => CON(dcon, unitLexp)
        !           171:     | VARexp (ref(VALvar{access=PATH(path),...})) => translatepath path
        !           172:     | VARexp (ref(VALvar{access=INLINE P.eql,typ=ref ty,...})) => 
        !           173:              Equal.equal(getEqualElem ty)
        !           174:     | VARexp (ref(VALvar{access=INLINE P.neq,typ=ref ty,...})) => 
        !           175:              composeNOT(Equal.equal(getEqualElem ty))
        !           176:     | VARexp (ref(VALvar{access=INLINE P.:=,typ=ref ty,...})) => 
        !           177:              PRIM(unboxedAssign ty)
        !           178:     | VARexp (ref(VALvar{access=INLINE P.update,typ=ref ty,...})) => 
        !           179:              PRIM(unboxedUpdate ty)
        !           180:     | VARexp (ref(VALvar{access=INLINE(n),typ=ref ty,...})) => PRIM n
        !           181:     | VARexp (ref(OVLDvar{name,...})) =>
        !           182:             (complain("unresolved overloading: "^Symbol.name name); unitLexp)
        !           183:     | APPexp (f,a) => APP(translate f, translate a)
        !           184:     | CONSTRAINTexp (e,t) => translate e
        !           185:     | HANDLEexp (e,HANDLER(FNexp l)) =>
        !           186:        let val rules = transrules l
        !           187:            fun anywild (WILDpat,_) = true
        !           188:              | anywild (VARpat _,_) = true
        !           189:              | anywild _ = false
        !           190:            val rules = if exists anywild rules then rules@[(WILDpat,unitLexp)]
        !           191:                        else rules@[reraise(),(WILDpat,unitLexp)]
        !           192:         in HANDLE (translate e, MC.matchCompile rules)
        !           193:        end
        !           194:     | RAISEexp e => RAISE (translate e)
        !           195:     | FNexp l => MC.matchCompile((transrules l)@[raisematch()])
        !           196:     | CASEexp (e,l) => APP(MC.matchCompile((transrules l)@[raisematch()]),
        !           197:                           translate e)
        !           198:     | LETexp (d,e) => makedec d (translate e)
        !           199:     | x => (PrintAbsyn.printExp(x,0,!printDepth); impossible "in translate")
        !           200: 
        !           201: val transDec = makedec
        !           202: 
        !           203: end (* structure Translate *)

unix.superglobalmegacorp.com

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