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

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: structure Absyn = struct
        !             3: 
        !             4: structure Basics = Basics
        !             5: 
        !             6: local
        !             7:   open Access Basics BasicTypes
        !             8:   val whileSym = Symbol.symbol "while"
        !             9:   and argSym = Symbol.symbol "arg"
        !            10: in
        !            11:        
        !            12: open BareAbsyn
        !            13: 
        !            14: val unitPat = RECORDpat{fields = nil, flex = false, typ = ref UNDEFty,
        !            15:                        pats = ref nil}
        !            16: val unitExp = RECORDexp nil
        !            17: 
        !            18: val truePat = CONpat(trueDcon)
        !            19: val trueExp = CONexp(trueDcon)
        !            20: val falsePat = CONpat(falseDcon)
        !            21: val falseExp = CONexp(falseDcon)
        !            22: 
        !            23: val nilPat = CONpat(nilDcon)
        !            24: val nilExp = CONexp(nilDcon)
        !            25: val consPat = fn pat => APPpat(consDcon,pat)
        !            26: val consExp = CONexp(consDcon)
        !            27: 
        !            28: fun TUPLEexp l = 
        !            29:    let fun addlabels(i,e::r) = 
        !            30:             (LABEL{number=i-1, name=(Tuples.numlabel i)}, e) :: addlabels(i+1, r)
        !            31:         | addlabels(_, nil) = nil
        !            32:     in RECORDexp (addlabels(1,l))
        !            33:    end
        !            34: 
        !            35: fun TUPLEpat l =
        !            36:    let fun addlabels(i,e::r) = (Tuples.numlabel i, e) :: addlabels(i+1, r)
        !            37:         | addlabels(_, nil) = nil
        !            38:     in RECORDpat{fields = addlabels(1,l), flex = false, typ = ref UNDEFty,
        !            39:                 pats = ref nil}
        !            40:    end
        !            41: 
        !            42: fun LISTexp l = fold (fn (e,rest) => APPexp(consExp,TUPLEexp[e,rest])) l nilExp
        !            43: 
        !            44: fun IFexp (a,b,c) =
        !            45:     CASEexp(a, [RULE(truePat,b), RULE(falsePat,c)])
        !            46: 
        !            47: fun ORELSEexp(a,b) =
        !            48:     IFexp(a,trueExp,b)
        !            49: 
        !            50: fun ANDALSOexp(a,b) =
        !            51:     IFexp(a,b,falseExp)
        !            52: 
        !            53: fun WHILEexp (a,b) =
        !            54:     let val tyref = ref UNDEFty
        !            55:        val lvar = namedLvar(whileSym)
        !            56:        val fb = VALvar{name=[whileSym],
        !            57:                        access=LVAR(lvar),
        !            58:                        typ=tyref}
        !            59:        val fa = VALvar{name=[whileSym],
        !            60:                        access=PATH[lvar],
        !            61:                        typ=tyref}
        !            62:         val id = fn x => x
        !            63:        val (markdec,markall,markend,markbody) =
        !            64:            case (a,b)
        !            65:             of (MARKexp(_,a1,a2), MARKexp(_,b1,b2)) =>
        !            66:                (fn e => MARKdec(e,a1,b2), fn e => MARKexp(e,a1,b2),
        !            67:                 fn e => MARKexp(e,b2,b2), fn e => MARKexp(e,b1,b2))
        !            68:              | _ => (id,id,id,id)
        !            69:       in LETexp(
        !            70:         markdec(
        !            71:          VALRECdec[
        !            72:            RVB{var=fb,
        !            73:                exp=markall(FNexp[
        !            74:                      RULE(unitPat,
        !            75:                           markall(IFexp(a,
        !            76:                                markbody (SEQexp[b, APPexp(markend(VARexp(ref fa)),
        !            77:                                                  markend unitExp)]),
        !            78:                                markend unitExp)))]),
        !            79:                resultty = NONE,
        !            80:                tyvars = nil}]),
        !            81:            APPexp(markall(VARexp (ref fa)), markend unitExp))
        !            82:     end
        !            83: 
        !            84: fun LISTpat l = fold (fn (e,rest) => APPpat(consDcon, TUPLEpat[e,rest])) l nilPat
        !            85: 
        !            86: fun FUNdec fbl =
        !            87:     let fun fb2rvb (FB {var, clauses as (CLAUSE{pats,...}::_),tyvars}) =
        !            88:            let fun getvars (hd::tl) = mkVALvar(argSym,ref UNDEFty) :: getvars tl
        !            89:                  | getvars nil = nil;
        !            90:                val vars = getvars pats
        !            91:                fun not1(f,[a]) = a
        !            92:                  | not1(f,l) = f l
        !            93:                fun dovar (VALvar{access=LVAR n,name,typ}) =
        !            94:                       VARexp(ref(VALvar{access=PATH[n],name=name,typ=typ}))
        !            95:                  | dovar _ = ErrorMsg.impossible "Absyn.FUNdec.dovar"
        !            96: 
        !            97:                fun doclause (CLAUSE{pats,exp,resultty=NONE}) =
        !            98:                              RULE(not1(TUPLEpat,pats), exp)
        !            99:                  | doclause (CLAUSE{pats,exp=MARKexp(exp',a,b),
        !           100:                                          resultty=SOME ty}) =
        !           101:                              RULE(not1(TUPLEpat,pats), 
        !           102:                                   MARKexp(CONSTRAINTexp(exp',ty),a,b))
        !           103:                  | doclause (CLAUSE{pats,exp,resultty=SOME ty}) =
        !           104:                              RULE(not1(TUPLEpat,pats),CONSTRAINTexp(exp,ty))
        !           105: 
        !           106:                fun last[x] = x | last (a::r) = last r
        !           107:                val mark =  case (hd clauses, last clauses)
        !           108:                             of (CLAUSE{exp=MARKexp(_,a,_),...},
        !           109:                                 CLAUSE{exp=MARKexp(_,_,b),...}) =>
        !           110:                                 (fn e => MARKexp(e,a,b))
        !           111:                              | _ => fn e => e
        !           112:                fun makeexp [var] = FNexp(map doclause clauses)
        !           113:                  | makeexp vars = fold 
        !           114:                                (fn (w,e) => FNexp[RULE(VARpat w,mark e)])
        !           115:                                vars
        !           116:                                (CASEexp(TUPLEexp(map dovar vars),
        !           117:                                         map doclause clauses))
        !           118:             in RVB {var=var,
        !           119:                     exp=makeexp vars,
        !           120:                     resultty=NONE,
        !           121:                     tyvars=tyvars}
        !           122:            end
        !           123:           | fb2rvb _ = ErrorMsg.impossible "absyn.38"
        !           124:      in VALRECdec (map fb2rvb fbl)
        !           125:     end
        !           126: 
        !           127: fun SELECTORexp id = 
        !           128:        let val v = namedLvar id
        !           129:            val tyref = ref UNDEFty
        !           130:            val v1 = VALvar{name=[id],access=LVAR v, typ=tyref}
        !           131:            val v2 = VALvar{name=[id],access=PATH[v],typ=tyref}
        !           132:         in FNexp[RULE(RECORDpat{fields=[(id,VARpat v1)], flex=true,
        !           133:                                 typ= ref UNDEFty, pats=ref nil},
        !           134:                        VARexp(ref v2))]
        !           135:        end
        !           136: 
        !           137: end (* local open Access Basics ... *)
        !           138: end (* structure Absyn *)

unix.superglobalmegacorp.com

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