Annotation of researchv10no/cmd/sml/src/print/printval.sml, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: (* printval.sml *)
        !             3: 
        !             4: structure PrintVal: PRINTVAL =
        !             5: struct
        !             6: 
        !             7: structure Basics = Basics
        !             8: 
        !             9: open System System.Unsafe Basics BasicTypes TypesUtil ErrorMsg PrintUtil
        !            10: 
        !            11: fun gettag obj = int (tuple obj sub 1)
        !            12: 
        !            13: exception Switch
        !            14: 
        !            15: fun switch(obj, TYCON{kind=DATAtyc dcons,...}) =
        !            16:     let fun try ((d as DATACON{rep,...})::r) = 
        !            17:            (case rep
        !            18:               of TAGGED i => if (gettag obj = i handle Boxity => false)
        !            19:                              then d else try r
        !            20:                | CONSTANT i => if (int obj = i handle Boxity => false)
        !            21:                                then d else try r
        !            22:                | TRANSPARENT =>
        !            23:                            if ((tuple obj; true) handle Boxity => false)
        !            24:                            then d else (try r handle Switch => d)
        !            25:                | TRANSB => if ((tuple obj; true) handle Boxity => false)
        !            26:                            then d else try r
        !            27:                | TRANSU => if ((int obj; true) handle Boxity => false)
        !            28:                            then d else try r
        !            29:                | REF => d
        !            30:                | _ => ErrorMsg.impossible "PrintVal.switch: funny datacon")
        !            31:          | try nil = raise Switch
        !            32:     in  try dcons
        !            33:        handle Switch => 
        !            34:          ErrorMsg.impossible "PrintVal.switch: none of the datacons matched"
        !            35:     end
        !            36: 
        !            37: fun decon(obj, DATACON{rep,...}) =
        !            38:     case rep
        !            39:      of UNDECIDED => ErrorMsg.impossible "undecided datacon in decon"
        !            40:       | TAGGED _ => tuple obj sub 0
        !            41:       | CONSTANT _ => ErrorMsg.impossible "constant datacon in decon"
        !            42:       | TRANSPARENT => obj
        !            43:       | TRANSU => obj
        !            44:       | TRANSB => obj
        !            45:       | REF => tuple obj sub 0
        !            46:       | VARIABLE _ => tuple obj sub 0
        !            47: 
        !            48: val noparen = INfix(0,0)
        !            49: 
        !            50: fun printVal(obj: object, ty: ty, depth: int) : unit =
        !            51:       printVal'(obj, ty, depth, noparen, noparen)
        !            52: 
        !            53: and printVal'(_,_,0,_,_) = print "#"
        !            54:   | printVal'(obj: object, ty: ty, depth: int, l: fixity, r: fixity) : unit =
        !            55:     case ty
        !            56:       of VARty(ref(INSTANTIATED t)) => printVal'(obj,t,depth,r,l)
        !            57:        | FLEXRECORDty(ref(CLOSED t)) => printVal'(obj,t,depth,r,l)
        !            58:        | CONty(ref(tyc as TYCON{kind,...}), argtys) => (* wrong!? *)
        !            59:           (case kind
        !            60:              of ABStyc =>
        !            61:                   if eqTycon(tyc,!intTycon) then print(makestring(int obj))
        !            62:                   else if eqTycon(tyc,!realTycon) then print(makestring(real obj))
        !            63:                   else if eqTycon(tyc,!stringTycon) then pr_mlstr(string obj)
        !            64:                   else if eqTycon(tyc,!arrowTycon) then print "fn"
        !            65:                   else print "-"
        !            66:                | DEFtyc _ =>
        !            67:                   printVal'(obj, reduceType ty, depth, l, r)
        !            68:               | DATAtyc _ =>
        !            69:                   if eqTycon(tyc,!listTycon)
        !            70:                     then printList(obj, hd argtys, depth)
        !            71:                     else printDcon(obj, tyc, argtys, depth, l, r)
        !            72:               | RECORDtyc [] => print "()"
        !            73:               | RECORDtyc labels =>
        !            74:                   if Tuples.isTUPLEtyc tyc
        !            75:                     then printTuple(tuple(obj), argtys, depth)
        !            76:                     else printRecord(tuple(obj), labels, argtys, depth))
        !            77:        | POLYty{tyfun=TYFUN{body,...},...} => printVal'(obj,body,depth,l,r)
        !            78:        | _ => print "-"
        !            79: 
        !            80: and printDcon(_,_,_,0,_,_) = print "#"
        !            81:   | printDcon(obj:object, tyc as TYCON{arity,...}, argtys,
        !            82:               depth:int, l:fixity, r:fixity) =
        !            83:     let val dcon as DATACON{name,const,typ,...} = switch(obj,tyc)
        !            84:        val dname = Symbol.name name
        !            85:      in if const
        !            86:        then print dname
        !            87:        else
        !            88:          let val fixity = EnvAccess.lookFIX name  (* may be inaccurate *)
        !            89:              val dom = case !typ
        !            90:                         of CONty(_,dom::_) => dom
        !            91:                          | POLYty{tyfun=TYFUN{body=CONty(_,dom::_),...},...} =>
        !            92:                              applyTyfun(TYFUN{arity=arity,body=dom},argtys)
        !            93:              val dom =  headReduceType(dom)
        !            94:              fun prdcon() =
        !            95:                  case (fixity,dom)
        !            96:                   of (INfix _,CONty(ref(domTyc as TYCON{kind=RECORDtyc _,...}),
        !            97:                                    [tyL,tyR])) =>
        !            98:                        let val twoTuple = tuple(decon(obj,dcon))
        !            99:                         in if Tuples.isTUPLEtyc domTyc
        !           100:                            then (
        !           101:                              printVal'(twoTuple sub 0,tyL,depth-1,NONfix,fixity);
        !           102:                              print " "; print dname; print " ";
        !           103:                              printVal'(twoTuple sub 1,tyR,depth-1,fixity,NONfix))
        !           104:                            else (
        !           105:                              print dname; print " ";
        !           106:                              printVal'(decon(obj,dcon),dom,depth-1,NONfix,NONfix))
        !           107:                        end
        !           108:                    | _ =>
        !           109:                       (print dname; print " ";
        !           110:                        printVal'(decon(obj,dcon),dom,depth-1,NONfix,NONfix))
        !           111:              fun prpardcon() = (print "("; prdcon(); print ")")
        !           112:           in case(l,r,fixity)
        !           113:              of (NONfix,NONfix,_) => prpardcon()
        !           114:               | (INfix _,INfix _,_) => prdcon()
        !           115:                  (* special case: only on first iteration, for no parens *)
        !           116:               | (_,_,NONfix) => prdcon()
        !           117:               | (INfix(_,p1),_,INfix(p2,_)) =>
        !           118:                   if p1 >= p2 then prpardcon()
        !           119:                   else prdcon()
        !           120:               | (_,INfix(p1,_),INfix(_,p2)) =>
        !           121:                   if p1 > p2 then prpardcon()
        !           122:                   else prdcon()
        !           123:          end
        !           124:     end
        !           125: 
        !           126: and printList(obj:object, ty:ty, depth:int) : unit =
        !           127:     let fun printTail(separator, p) =
        !           128:             let val dcon as DATACON{name,...} = switch(p, !listTycon)
        !           129:             in case (Symbol.name name)
        !           130:                  of "nil" => print "]"
        !           131:                   | "::" => 
        !           132:                       let val pair = tuple(decon(p, dcon))
        !           133:                        in print separator;
        !           134:                           printVal(pair sub 0, ty, depth-1);
        !           135:                           printTail (",", pair sub 1)
        !           136:                       end
        !           137:             end
        !           138:      in print "["; printTail("",obj)
        !           139:     end
        !           140: 
        !           141: and printTuple(objs: object array, tys: ty list, depth:int) : unit =
        !           142:     let fun printFields(nf,[ty]) = printVal(objs sub nf,ty,depth-1)
        !           143:          | printFields(nf, ty::restty) = 
        !           144:              (printVal(objs sub nf,ty,depth-1); print(",");
        !           145:               printFields(nf+1,restty))
        !           146:          | printFields(nf,[]) = ()
        !           147:      in print("("); printFields(0,tys); print(")")
        !           148:     end
        !           149: 
        !           150: and printRecord(objs: object array, labels: label list, tys: ty list, depth:int) =
        !           151:     let fun printFields(nf,[l],[ty]) = 
        !           152:              (print(Symbol.name l); print("="); printVal(objs sub nf,ty,depth-1))
        !           153:          | printFields(nf, l::restl, ty::restty) = 
        !           154:              (print(Symbol.name l); print("="); printVal(objs sub nf,ty,depth-1);
        !           155:               print(","); printFields(nf+1,restl,restty))
        !           156:          | printFields(nf,[],[]) = ()
        !           157:      in print("{"); printFields(0,labels,tys); print("}")
        !           158:     end
        !           159: 
        !           160: end (* structure PrintVal *)

unix.superglobalmegacorp.com

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