|
|
1.1 root 1: (* Copyright 1989 by AT&T Bell Laboratories *)
2: signature TUPLES = sig
3: structure Basics : BASICS
4: val numlabel : int -> Basics.label
5: val mkTUPLEtyc : int -> Basics.tycon
6: val isTUPLEtyc : Basics.tycon -> bool
7: val mkRECORDtyc : Basics.label list -> Basics.tycon
8: end
9:
10: structure Tuples : TUPLES = struct
11:
12: structure Basics = Basics
13:
14: structure Labels =
15: struct datatype labelOpt = NOlabel | SOMElabel of Basics.label
16: datatype tyconOpt = NOtycon | SOMEtycon of Basics.tycon
17: end
18:
19: open Labels Basics
20:
21: structure LabelArray =
22: Dynamic (struct open Array
23: type array = Labels.labelOpt array
24: type elem = Labels.labelOpt
25: end)
26:
27: structure TyconArray =
28: Dynamic (struct open Array
29: type array = Labels.tyconOpt array
30: type elem = Labels.tyconOpt
31: end)
32:
33: exception New
34: val tyconTable = IntStrMap.new(32,New) : tycon IntStrMap.intstrmap
35: val tyconMap = IntStrMap.map tyconTable
36: val tyconAdd = IntStrMap.add tyconTable
37:
38: fun labelsToSymbol(labels: label list) : Symbol.symbol =
39: let fun wrap [] = ["}"]
40: | wrap [id] = [Symbol.name id, "}"]
41: | wrap (id::rest) = Symbol.name id :: "," :: wrap rest
42: in Symbol.symbol(implode("{" :: wrap labels))
43: end
44:
45: fun mkRECORDtyc(labels: label list) : tycon =
46: let val recordName = labelsToSymbol labels
47: val number = Symbol.number recordName
48: val name = Symbol.name recordName
49: in tyconMap(number,name)
50: handle New =>
51: let val tycon = TYCON{stamp = Stampset.newStamp(Stampset.fixedTycStamps),
52: arity = length labels,
53: eq = ref YES,
54: path = [recordName],
55: kind = RECORDtyc labels}
56: in tyconAdd(number,name,tycon);
57: tycon
58: end
59: end
60:
61: val numericLabels = LabelArray.array(NOlabel)
62: val tupleTycons = TyconArray.array(NOtycon)
63:
64: fun numlabel i =
65: case LabelArray.sub(numericLabels,i)
66: of NOlabel =>
67: let val newlabel = Symbol.symbol(makestring i)
68: in LabelArray.update(numericLabels,i,SOMElabel(newlabel));
69: newlabel
70: end
71: | SOMElabel(label) => label
72:
73: fun numlabels n =
74: let fun labels (0,acc) = acc
75: | labels (i,acc) = labels (i-1, numlabel i :: acc)
76: in labels (n,nil)
77: end
78:
79: fun mkTUPLEtyc n =
80: case TyconArray.sub(tupleTycons,n)
81: of NOtycon =>
82: let val tycon = mkRECORDtyc(numlabels n)
83: in TyconArray.update(tupleTycons,n,SOMEtycon(tycon));
84: tycon
85: end
86: | SOMEtycon(tycon) => tycon
87:
88: fun checklabels (2,nil) = false (* {1:t} is not a tuple *)
89: | checklabels (n,nil) = true
90: | checklabels (n, lab::labs) =
91: Symbol.eq(lab, numlabel n) andalso checklabels(n+1,labs)
92:
93: fun isTUPLEtyc(TYCON{kind=RECORDtyc labels,...}) = checklabels(1,labels)
94: | isTUPLEtyc _ = false
95:
96: end (* structure Tuples *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.