|
|
1.1 root 1: (* Copyright 1989 by AT&T Bell Laboratories *)
2: (* printdec.sml *)
3:
4: structure PrintDec : PRINTDEC =
5: struct
6:
7: structure BareAbsyn = BareAbsyn
8: type object = System.Unsafe.object
9:
10: open Basics BareAbsyn PrintUtil PrintBasics PrintType PrintVal Access
11:
12: val printDepth = System.Control.Print.printDepth
13:
14: val sortBinders = Sort.sort BuildMod.binderGt
15:
16: fun printFormals 0 = ()
17: | printFormals 1 = (print "'a "; print " ")
18: | printFormals n = (printTuple (fn s => (print "'"; print s)) (typeFormals n);
19: print " ")
20:
21: local
22: fun printVb lookup (VB{pat,...}) =
23: let fun printBind(pat) =
24: case pat
25: of VARpat(VALvar{name=[n],access=LVAR lv,typ=ref ty}) =>
26: (print "val "; printSym n; print " = ";
27: printVal(lookup lv, ty, !printDepth);
28: print " : "; printType ty;
29: newline())
30: | RECORDpat{pats=ref pl,...} => app printBind pl
31: | APPpat(_,pat) => printBind pat
32: | CONSTRAINTpat(pat,_) => printBind pat
33: | LAYEREDpat(pat1,pat2) => (printBind pat1; printBind pat2)
34: | _ => ()
35: in printBind pat
36: end
37:
38: and printRvb lookup (RVB{var=VALvar{name=[n],access=LVAR lv,typ=ref ty},...}) =
39: (print "val "; printSym n; print " = ";
40: printVal(lookup lv, ty, !printDepth);
41: print " : "; printType ty; newline())
42:
43: and printTb(TB{tyc=ref(TYCON{path=name::_, arity, ...}),def}) =
44: (print "type ";
45: printFormals arity; print " ";
46: printSym name; print " = "; printType def; newline())
47:
48: and printAbsTyc(ref(TYCON{path=name::_, arity, eq, kind=ABStyc, ...})) =
49: (print(if (!eq=YES) then "eqtype" else "type");
50: printFormals arity; print " ";
51: printSym name; newline())
52:
53: and printDataTyc(ref(TYCON{path=name::_,arity,kind=DATAtyc dcons,...})) =
54: (print "datatype ";
55: printFormals arity; print " ";
56: printSym name; newline();
57: app (fn DATACON{name,typ,...} =>
58: (print "con "; printSym name; print " : ";
59: printType(!typ); newline()))
60: dcons)
61:
62: and printEb(EBgen{exn=DATACON{name,...},etype}) =
63: (print "exception "; printSym name;
64: case etype
65: of NONE => ()
66: | SOME ty' =>
67: if BasicTypes.isArrowType ty'
68: then (print " of "; printType(BasicTypes.domain ty'))
69: else ();
70: newline())
71: | printEb(EBdef{exn=DATACON{name,...},edef=DATACON{name=dname,...}}) =
72: (print "exception "; printSym name; print " = "; printSym dname;
73: newline())
74:
75: and printSigVar(SIGvar{name,binding}) =
76: (print "signature "; printSym name;
77: if !System.Control.Print.signatures
78: then (print " =\n sig"; printStr binding; print "\n end\n")
79: else newline())
80:
81: and printStrVar(STRvar{name,binding,...}) =
82: (print "structure "; print(formatQid name);
83: if !System.Control.Print.signatures
84: then (print " :\n sig"; printStr binding; print "\n end\n")
85: else newline())
86:
87: and printStr(str as STRstr{table,env,kind,...}) =
88: let val tInC = case kind
89: of STRkind _ => (fn t => TypesUtil.typeInContext(t,env))
90: | SIGkind _ => TypesUtil.printableType str
91: fun printBinder(VARbind(VALvar{name=[n],typ,...})) =
92: (nlindent 4; print "val ";
93: printSym n; print " : ";
94: printType(tInC(!typ)))
95: | printBinder(CONbind(DATACON{name,typ,rep=VARIABLE _,...})) =
96: (nlindent 4; print "exception "; printSym name;
97: if BasicTypes.isUnitTy(!typ)
98: then ()
99: else (print " of "; printType(tInC(!typ))))
100: | printBinder(TYCbind(ref(tyc))) =
101: let val TYCON{path=name::_,kind,arity,eq,...} =
102: TypesUtil.tyconInContext env tyc
103: in nlindent 4;
104: case kind
105: of DATAtyc dcons =>
106: (print "datatype ";
107: printFormals arity;
108: printSym name; nlindent(6); print "con ";
109: printvseq (6) "con "
110: (fn DATACON{name,typ,...} =>
111: (printSym name; print " : ";
112: printType(tInC(!typ))))
113: dcons)
114: | _ =>
115: (if (!eq=YES)
116: then print "eqtype "
117: else print "type ";
118: printFormals arity;
119: printSym(name))
120: end
121: | printBinder(STRbind(STRvar{name=[n],binding,...})) =
122: (nlindent 4; print "structure ";
123: printSym n; print " : sig...end")
124: | printBinder(FIXbind(FIXvar{name,binding=INfix(l,r)})) =
125: (nlindent 4;
126: print "infix "; print l; print " "; print r; print " ";
127: printSym name)
128: | printBinder _ = ()
129: val bindlist = ref nil
130: val _ = IntStrMap.app (fn x => bindlist := x ::(!bindlist)) table
131: val binders = sortBinders(!bindlist)
132: val e = Env.current()
133: in Env.openOld({path=nil,strenv=env},table); (* affects printType *)
134: app (fn (_,_,b) => printBinder b) binders;
135: Env.resetEnv e
136: end
137:
138: and printStrb(STRB{strvar,...}) =
139: printStrVar strvar
140:
141: and printFctb(FCTB{fctvar,...}) =
142: printFunctorVar fctvar
143:
144: and printFunctorVar(FCTvar{name,...}) =
145: (print "functor "; printSym name; print " : <sig>\n")
146:
147: (* not used, because of special top-level open *)
148: and printOpen(strvl) =
149: (print "open ";
150: printSequence " " (fn STRvar{name,...} => print(formatQid name)) strvl;
151: newline())
152:
153: and printBinding(b: Basics.binding): unit=
154: case b of
155: FCTbind(functorVar)=> printFunctorVar functorVar
156: | SIGbind(signatureVar)=> printSigVar signatureVar
157: | _ => print "<other binding>\n"
158:
159: in (* local *)
160:
161: fun printDec lookup dec =
162: let val printDec0 = printDec lookup
163: in
164: case (resetPrintType(); dec)
165: of VALdec vbs => app (printVb lookup) vbs
166: | VALRECdec rvbs => app (printRvb lookup) rvbs
167: | TYPEdec tbs => app printTb tbs
168: | DATATYPEdec{datatycs,withtycs} =>
169: (app printDataTyc datatycs; app printTb withtycs)
170: | ABSTYPEdec{abstycs,withtycs,body} =>
171: (app printAbsTyc abstycs;
172: app printTb withtycs;
173: printDec0 body)
174: | EXCEPTIONdec ebs => app printEb ebs
175: | STRdec strbs => app printStrb strbs
176: | FCTdec fctbs => app printFctb fctbs
177: | SIGdec sigvars => app printSigVar sigvars
178: | LOCALdec(decIn,decOut) => printDec0 decOut
179: | SEQdec decs => app printDec0 decs
180: | OPENdec strvs => printOpen strvs
181: | IMPORTdec _ => ErrorMsg.impossible "printDec(IMPORT)"
182: | MARKdec(dec,a,b) => printDec0 dec
183: end (* fun printDec *)
184:
185: fun printBindingTbl(tbl: Basics.symtable)=
186: (let val _ = resetPrintType();
187: val bindlist = ref []
188: val _ = IntStrMap.app (fn x => bindlist:= x :: (!bindlist)) tbl
189: val binders = sortBinders (!bindlist)
190: in app printBinding (map (fn(i,s,b)=> b) binders)
191: end)
192: end (* local *)
193:
194: end (* structure PrintDec *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.