annotate types.js @ 101:5d15b91e738a

Fix paramerized types. Remove debug print calls.
author Mike Pavone <pavone@retrodev.com>
date Thu, 09 Aug 2012 08:09:14 -0700
parents 9db0e3533b23
children 92ff9630897a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 function anytype() {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 anytype.prototype.satisfiedBy = function(type) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3 return true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
4 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5 anytype.prototype.str = function(indent) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 if (indent === undefined) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 indent = '';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9 return indent + 'any\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 anytype.prototype.id = 0;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 anytype.prototype.callable = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 anytype.prototype.replaceParams = function() { return this; };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14 var any = new anytype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
16 function typeparam(name, base)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
18 this.name = name;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 this.base = base;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 this.callable = base.callable;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22 typeparam.prototype.replaceParams = function(paramtypes) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
23 if (!(this.name in paramtypes)) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
24 return this;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
26 if (!this.base.satisfiedBy(paramtypes[this.name])) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
27 throw new Error('param ' + this.name + ' has base type ' + this.base.str() + ' which is not satisfied by ' + paramtypes[this.name].str());
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
28 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
29 return paramtypes[this.name];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
30 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
31 typeparam.prototype.satisfiedBy = function(type) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
32 return this.base.satisfiedBy(type);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
33 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34 typeparam.prototype.str = function(indent) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35 return indent + 'param ' + this.name + '\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 var nexttypeid = 1;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
40 function objecttype()
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
41 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
42 this.messages = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
43 this.id = nexttypeid++;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 this.typeparams = [];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45 this.satisfies_cache = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 this.satisfies_cache[this.id] = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
48
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 objecttype.prototype.callable = false;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 objecttype.prototype.addMessage = function(name, type)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 this.messages[name] = type;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
55
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56 objecttype.prototype.satisfiedBy = function(type) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57 if (type.id in this.satisfies_cache) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
58 return this.satisfies_cache[type.id];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
60 if (type.lazyinit) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
61 type.lazyinit();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
62 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
63 //temporarily set cache entry to true to prevent infinite recursion
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
64 this.satisfies_cache[type.id] = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
65 var ret = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
66 if (type.messages === undefined) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
67 ret = false;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
68 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
69 if (ret) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
70 for (var msgname in this.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
71 if (!(msgname in type.messages) || !this.messages[msgname].satisfiedBy(type.messages[msgname])) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
72 ret = false;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
73 break;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
74 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
75 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
76 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
77 this.satisfies_cache[type.id] = ret;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
78 return ret;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
79 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81 objecttype.prototype.str = function(indent) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
82 if (indent === undefined) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83 indent = '';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
84 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
85 if (indent.length > 6) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
86 return 'max depth reached\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
87 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
88 var newindent = indent + '\t';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
89 var childindent = newindent + '\t'
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
90 var ret = indent + 'objectype {\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
91 for (var msgname in this.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
92 ret += newindent + msgname + ':\n' + this.messages[msgname].str(childindent)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
93 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
94 return ret + indent + '}\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
95 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
96
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
97 objecttype.prototype.replaceParams = function(paramtypes, visited) {
100
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
98 if (visited === undefined) {
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
99 visited = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
100 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
101 if (this.id in visited) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
102 return visited[this.id];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
103 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
104 var me = visited[this.id] = this.clone();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
105 for (var msgname in this.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
106 me.messages[msgname] = me.messages[msgname].replaceParams(paramtypes, visited);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
107 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
108 return me;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
109 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
110
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
111 objecttype.prototype.clone = function() {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
112 var clone = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
113 for (var msgname in this.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
114 clone.messages[msgname] = this.messages[msgname];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
115 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
116 clone.typeparams = this.typeparams;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
117 return clone;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
118 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
119
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
120 function lambdatype()
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
121 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
122 this.id = nexttypeid++;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
123 this.messages = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
124 this.params = [];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
125 this.paramlu = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
126 this.typeparams = [];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
127 this.returntype = any;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
128 this.satisfies_cache = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
129 this.satisfies_cache[this.id] = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
130 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
131
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
132 lambdatype.prototype.callable = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
133
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
134 lambdatype.prototype.addParam = function(name) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
135 this.paramlu[name] = this.params.length;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
136 this.params.push(any);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
137 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
138
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
139 lambdatype.prototype.paramType = function(name, type) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
140 this.params[this.paramlu[name]] = type;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
141 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
142
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
143 lambdatype.prototype.addMessage = function(name, type)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
144 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
145 this.messages[name] = type;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
146 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
147
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
148 lambdatype.prototype.satisfiedBy = function(type) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
149 if (type.id in this.satisfies_cache) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
150 return this.satisfies_cache[type.id];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
151 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
152 if (type.lazyinit) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
153 type.lazyinit();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
154 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
155 //temporarily set cache entry to true to prevent infinite recursion
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
156 this.satisfies_cache[type.id] = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
157 var ret = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
158 if (!(type.callable) || this.params.length != type.params.length) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
159 ret = false;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
160 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
161 if (ret) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
162 for (var i in this.params) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
163 if (i >= type.params.length || !this.params[i].satisfiedBy(type.params[i])) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
164 ret = false;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
165 break;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
166 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
167 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
168 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
169 if (ret) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
170 for (var msgname in this.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
171 if (!(msgname in type.messages) || !this.messages[msgname].satisfiedBy(type.messages[msgname])) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
172 ret = false;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
173 break;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
174 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
175 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
176 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
177 ret = ret && this.returntype.satisfiedBy(type.returntype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
178 this.satisfies_cache[type.id] = ret;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
179 return ret;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
180 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
181
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
182 lambdatype.prototype.str = function(indent) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
183 if (indent === undefined) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
184 indent = '';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
185 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
186 if (indent.length > 6) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
187 return 'max depth reached\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
188 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
189 var newindent = indent + '\t';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
190 var childindent = newindent + '\t'
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
191 var ret = indent + 'lambdatype {\n' + newindent + 'params: {\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
192 for (var i = 0; i < this.params.length; i++) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
193 ret += childindent + i + ':\n' + this.params[i].str(childindent + '\t');
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
194 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
195 ret += newindent + '}\n' + newindent + 'returntype:\n' + this.returntype.str(childindent);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
196
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
197 for (var msgname in this.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
198 ret += newindent + msgname + ':\n' + this.messages[msgname].str(childindent)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
199 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
200 return ret + indent + '}\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
201 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
202
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
203 lambdatype.prototype.replaceParams = function(paramtypes, visited) {
100
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
204 if (visited === undefined) {
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
205 visited = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
206 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
207 if (this.id in visited) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
208 return visited[this.id];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
209 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
210 var me = visited[this.id] = this.clone();
101
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
211 for (var msgname in me.messages) {
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
212 me.messages[msgname] = me.messages[msgname].replaceParams(paramtypes, visited);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
213 }
101
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
214 for (var i in me.params) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
215 me.params[i] = me.params[i].replaceParams(paramtypes, visited);
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
216 }
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
217 me.returntype = me.returntype.replaceParams(paramtypes, visited);
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
218 return me;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
219 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
220
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
221 lambdatype.prototype.clone = function() {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
222 var clone = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
223 for (var msgname in this.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
224 clone.messages[msgname] = this.messages[msgname];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
225 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
226 clone.paramlu = this.paramlu;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
227 clone.params = this.params.slice(0, this.params.length);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
228 clone.returntype = this.returntype;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
229 clone.typeparams = this.typeparams;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
230 return clone;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
231 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
232
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
233 function uniontype(a, b)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
234 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
235 this.a = a;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
236 this.b = b;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
237 this.id = nexttypeid++;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
238 this.satisfies_cache = null;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
239 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
240
101
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
241 uniontype.prototype = {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
242 lazyinit: function() {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
243 if (this.satisfies_cache == null) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
244 this.satisfies_cache = {};
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
245 this.satisfies_cache[this.id] = true;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
246 this._messages = {};
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
247 if (this.a.messages !== undefined && this.b.messages !== undefined) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
248 for (var msgname in this.a.messages) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
249 if (msgname in this.b.messages) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
250 this._messages[msgname] = mkunion(this.a.messages[msgname], this.b.messages[msgname]);
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
251 }
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
252 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
253 }
101
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
254 this._callable = false;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
255 if (this.a.callable && this.b.callable && this.a.params.length == this.b.params.length) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
256 this._callable = true;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
257 this._params = [];
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
258 for (var i = 0; i < this.a.params.length; i++) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
259 this._params.push(mkunion(this.a.params[i], this.b.params[i]));
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
260 }
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
261 this._returntype = mkunion(this.a.returntype, this.b.returntype);
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
262 }
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
263 }
101
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
264 },
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
265 satisfiedBy: function(type)
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
266 {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
267 this.lazyinit();
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
268 if (type.id in this.satisfies_cache) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
269 return this.satisfies_cache[type.id];
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
270 }
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
271 this.satisfies_cache[type.id] = true;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
272 var ret = this.a.satisfiedBy(type) || this.b.satisfiedBy(type);
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
273 this.satisfies_cache[type.id] = ret;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
274 return ret;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
275 },
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
276 str: function(indent)
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
277 {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
278 if (indent === undefined) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
279 indent = '';
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
280 }
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
281 if (indent.length > 6) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
282 return 'max depth reached\n';
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
283 }
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
284 return indent + 'Union {\n\t' + indent + this.a.str(indent+'\t') + '\t' + indent + this.b.str(indent+'\t') + indent + '}\n';
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
285 },
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
286 replaceParams: function(paramtypes, visited) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
287 if (visited === undefined) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
288 visited = {};
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
289 }
101
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
290 if (this.id in visited) {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
291 return visited[this.id];
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
292 }
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
293 var me = visited[this.id] = this.clone();
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
294 me.a = me.a.replaceParams(paramtypes, visited);
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
295 me.b = me.b.replaceParams(paramtypes, visited);
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
296 return me;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
297 },
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
298 clone: function() {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
299 return new uniontype(this.a, this.b);
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
300 },
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
301 get messages() {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
302 this.lazyinit();
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
303 return this._messages;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
304 },
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
305 get params() {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
306 this.lazyinit();
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
307 return this._params;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
308 },
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
309 get returntype() {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
310 this.lazyinit();
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
311 return this._returntype;
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
312 },
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
313 get callable() {
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
314 this.lazyinit();
5d15b91e738a Fix paramerized types. Remove debug print calls.
Mike Pavone <pavone@retrodev.com>
parents: 100
diff changeset
315 return this._callable;
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
316 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
317 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
318
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
319
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
320 function mkunion(a, b)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
321 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
322 //if b is a subtype of a, then a | b is equivalent to a
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
323 if (a.satisfiedBy(b)) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
324 return a;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
325 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
326 //if a is a subtype of b, then a | b is equivalent to b
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
327 if (b.satisfiedBy(a)) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
328 return b;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
329 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
330 return new uniontype(a, b);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
331 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
332
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
333 function withtparams(type, params)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
334 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
335 this.type = type;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
336 this.params = params;
100
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
337 this.replaced = false;
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
338 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
339
100
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
340 withtparams.prototype = {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
341 satisfiedBy: function(type) {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
342 this.lazyinit();
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
343 return this.type.satisfiedBy(type);
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
344 },
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
345 str: function(indent) {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
346 if (indent === undefined) {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
347 indent = '';
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
348 }
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
349 if (indent.length > 6) {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
350 return 'max depth reached\n';
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
351 }
100
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
352 return this.type.str(indent) + indent + '<' + this.params.map(function(p) { return p.str(indent); }).join(', ') + '>';
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
353 },
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
354 replaceParams: function(paramtypes) {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
355 var replaced = false;
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
356 for (var i in this.params) {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
357 var newp = this.params[i].replaceParams(paramtypes);
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
358 if (newp != this.params[i]) {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
359 replaced = true;
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
360 this.params[i] = newp;
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
361 }
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
362 }
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
363 return this;
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
364 },
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
365 lazyinit: function() {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
366 if (!this.replaced) {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
367 var childptypes = {};
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
368 for (var i in this.type.typeparams) {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
369 childptypes[this.type.typeparams[i]] = this.params[i]
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
370 }
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
371 this.type = this.type.replaceParams(childptypes, {});
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
372 this.replaced = true;
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
373 }
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
374 },
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
375 get messages() {
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
376 this.lazyinit();
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
377 return this.type.messages;
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
378 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
379 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
380
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
381 function typetest()
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
382 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
383 var foo = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
384 var msgtype = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
385 msgtype.addParam('fo');
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
386 msgtype.returntype = foo;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
387 foo.addMessage('bar', msgtype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
388 var baz = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
389 var msgtype2 = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
390 msgtype2.addParam('fo');
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
391 msgtype2.paramType('fo', foo);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
392 msgtype2.returntype = baz;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
393 baz.addMessage('bar', msgtype2);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
394 baz.addMessage('qux', msgtype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
395 var shizzle = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
396 shizzle.addMessage('bar', msgtype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
397 shizzle.addMessage('boo', msgtype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
398 return {foo: foo, baz: baz, shizzle: shizzle};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
399 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
400
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
401 function paramtypetest()
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
402 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
403 var empty = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
404 var tlnode = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
405 tlnode.typeparams = ['T'];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
406 var t = new typeparam('T', any);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
407 var q = new typeparam('Q', any);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
408 var head = new lambdatype();
100
9db0e3533b23 Some work on parameterized types
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
409 head.returntype = t;
99
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
410 tlnode.addMessage('head', head);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
411 var tail = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
412 var econs = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
413 econs.addParam('val');
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
414 econs.typeparams = ['Q'];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
415 econs.paramType('val', q);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
416 econs.returntype = new withtparams(tlnode, [q]);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
417 empty.addMessage('cons', econs);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
418 tail.returntype = new uniontype(new withtparams(tlnode, [t]), empty);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
419 tlnode.addMessage('tail', tail);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
420 var cons = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
421 cons.addParam('val');
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
422 cons.paramType('val', t);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
423 cons.returntype = new withtparams(tlnode, [t]);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
424 tlnode.addMessage('cons', cons);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
425 return {empty: empty, tlnode: tlnode};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
426 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
427