Annotation of researchv10no/cmd/sml/src/translate/mcprint.sml, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: (* mcprint.sml *)
                      3: 
                      4: signature MCprint =
                      5:   sig
                      6:     structure Access : ACCESS
                      7:     structure A : BAREABSYN
                      8:     structure L : LAMBDA
                      9:     val printCon : L.con -> unit
                     10:     val printLexp : L.lexp -> unit
                     11:     val printMatch : (A.pat * L.lexp) list -> unit
                     12:     val printFun : L.lexp -> Access.lvar -> unit
                     13:   end
                     14: 
                     15: structure MCprint : MCprint = struct
                     16: 
                     17: structure Access = Access
                     18: structure A = BareAbsyn
                     19: structure L = Lambda
                     20: 
                     21: open Access Basics A L PrintUtil PrintBasics PrintAbsyn ErrorMsg
                     22: val margin = ref 0
                     23:   
                     24: fun indent i = margin := !margin + i
                     25:   
                     26: exception Undent
                     27:   
                     28: fun undent i = (margin := !margin - i; if !margin < 0 then raise Undent else ())
                     29: 
                     30: fun dent () = tab(!margin)
                     31: 
                     32: fun printCon (DATAcon dcon) = printDcon dcon
                     33:   | printCon (INTcon i) = print i
                     34:   | printCon (REALcon r) = print r
                     35:   | printCon (STRINGcon s) = pr_mlstr s
                     36: 
                     37: (* use of complex in printLexp may lead to stupid n^2 behavior. *)
                     38: val rec complex =
                     39:      fn VAR w => false
                     40:       | FN(_,b) => complex b
                     41:       | FIX(vl,ll,b) => true
                     42:       | APP(FN _,_) => true
                     43:       | APP(l,r) => complex l orelse complex r
                     44:       | SWITCH (l,ls,d) => true
                     45:       | RECORD l => let fun f nil = false | f (hd::tl) = complex hd orelse f tl
                     46:                    in  f l
                     47:                    end
                     48:       | SELECT(_,l) => complex l
                     49:       | HANDLE _ => true | RAISE l => complex l
                     50:       | INT _ => false | STRING _ => false | REAL _ => false
                     51:       | PRIM _ => false
                     52: fun printLexp (VAR v) = print(lvarName v)
                     53:   | printLexp (INT i) = print i
                     54:   | printLexp (REAL s) = print s
                     55:   | printLexp (STRING s) = pr_mlstr s
                     56:   | printLexp (r as RECORD l) =
                     57:        if complex r
                     58:           then (print "RECORD";
                     59:                 indent 7;
                     60:                 printTuple (fn l => (printLexp l; newline(); dent())) l;
                     61:                 undent 7)
                     62:           else (print "RECORD"; printTuple printLexp l)
                     63:   | printLexp (PRIM p) = print ("PRIM "^Prim.inLineName p)
                     64:   | printLexp (l as SELECT(i,_)) =
                     65:        let fun gather(SELECT(i,l)) =
                     66:                let val (more,root) = gather l
                     67:                in  (i :: more,root)
                     68:                end
                     69:              | gather l = (nil,l)
                     70:            val (path,root) = gather l
                     71:            fun ipr (i:int) = print i
                     72:        in  printLexp root;
                     73:            printClosedSequence ("[",",","]") ipr (rev path)
                     74:        end
                     75:   | printLexp (FN(v,l)) = 
                     76:        (print "FN("; print(lvarName v); print ",";
                     77:         if complex l then (newline(); indent 3; dent();
                     78:                            printLexp l; print ")"; undent 3)
                     79:         else (printLexp l; print ")")
                     80:         )
                     81:   | printLexp (APP(FN(v,l),r)) =
                     82:        let val lv = lvarName v
                     83:            val len = size lv + 3
                     84:        in  print lv; print " = ";
                     85:            indent len ; printLexp r; undent len;
                     86:            newline(); dent(); printLexp l
                     87:        end
                     88:   | printLexp (APP(l,r)) = 
                     89:        (print "APP(";
                     90:         if complex l orelse complex r
                     91:           then (indent 4; printLexp l; print ",\n"; dent();
                     92:                 printLexp r; print ")"; undent 4)
                     93:           else (printLexp l; print ",";
                     94:                 printLexp r; print ")"))
                     95:   | printLexp (SWITCH (l,llist,default)) =
                     96:        let fun switch [(c,l)] =
                     97:                  (printCon c; print " => ";
                     98:                   indent 8; printLexp l; undent 8)
                     99:              | switch ((c,l)::more) = 
                    100:                  (printCon c; print " => ";
                    101:                   indent 8; printLexp l; undent 8; newline(); dent();
                    102:                   switch more)
                    103:        in  print "SWITCH ";
                    104:            indent 7;
                    105:            printLexp l;
                    106:            undent 6;
                    107:            newline(); dent();
                    108:            print "of "; indent 3;
                    109:            switch llist;
                    110:            case (default,llist)
                    111:              of (NONE,_) => ()
                    112:               | (SOME l,nil) =>
                    113:                   (print "_ => ";
                    114:                    indent 5; printLexp l; undent 5)
                    115:               | (SOME l,_) =>
                    116:                   (newline(); dent(); print "_ => ";
                    117:                    indent 5; printLexp l; undent 5);
                    118:            undent 4
                    119:        end
                    120:   | printLexp (FIX (varlist,lexplist,lexp)) =
                    121:        let fun flist([v],[l]) =
                    122:                let val lv = lvarName v
                    123:                    val len = size lv + 2
                    124:                in  print lv; print ": ";
                    125:                    indent len ; printLexp l; undent len
                    126:                end
                    127:              | flist(v::vs,l::ls) =
                    128:                let val lv = lvarName v
                    129:                    val len = size lv + 2
                    130:                in  print lv; print ": ";
                    131:                    indent len ; printLexp l; undent len;
                    132:                    newline(); dent(); flist(vs,ls)
                    133:                end
                    134:              | flist(nil,nil) = ()
                    135:        in  print "FIX("; indent 4; flist(varlist,lexplist); undent 4;
                    136:            newline(); dent(); print "IN  ";
                    137:            indent 4; printLexp lexp; print ")"; undent 4
                    138:        end
                    139:   | printLexp (RAISE l) = (print "RAISE "; indent 6; printLexp l; undent 6)
                    140:   | printLexp (HANDLE (lexp,withlexp)) =
                    141:       (print "HANDLE "; indent 7; printLexp lexp;
                    142:        undent 5; newline(); dent();
                    143:        print "WITH "; indent 5; printLexp withlexp; undent 7)
                    144: 
                    145: fun printMatch ((p,r)::more) =
                    146:       (printPat(p,!System.Control.Print.printDepth);
                    147:        print " => "; printLexp r; newline(); printMatch more)
                    148:   | printMatch nil = ()
                    149: 
                    150: fun printFun l v =
                    151:     let val rec findit =
                    152:         fn VAR w => if v=w 
                    153:                       then (print("VAR " ^ lvarName v ^ " is free in <lexp>\n");
                    154:                             ())
                    155:                       else ()
                    156:          | l as FN(w,b) => if v=w then printLexp l else findit b
                    157:          | l as FIX(vl,ll,b) => if exists (fn w => v=w) vl
                    158:                                   then printLexp l
                    159:                                   else (app findit ll; findit b)
                    160:          | APP(l,r) => (findit l; findit r)
                    161:          | SWITCH (l,ls,d) =>
                    162:                (findit l;
                    163:                 app (fn(_,l) => findit l) ls;
                    164:                 case d of NONE => () | SOME l => findit l)
                    165:          | RECORD l => app findit l | SELECT(_,l) => findit l
                    166:          | HANDLE(e,h) => (findit e; findit h) | RAISE l => findit l
                    167:          | INT _ => () | STRING _ => () | REAL _ => ()
                    168:          | PRIM _ => ()
                    169:     in  findit l
                    170:     end
                    171: 
                    172: 
                    173: end (* struct MCprint *)

unix.superglobalmegacorp.com

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