annotate types.js @ 99:b58b19c455ec

Initial work on type system
author Mike Pavone <pavone@retrodev.com>
date Tue, 07 Aug 2012 23:29:21 -0700
parents
children 9db0e3533b23
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) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
98 if (visisted === undefined) {
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) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
204 if (visisted === undefined) {
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();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
211 for (var msgname in this.messages) {
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 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
214 return me;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
215 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
216
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
217 lambdatype.prototype.clone = function() {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
218 var clone = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
219 for (var msgname in this.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
220 clone.messages[msgname] = this.messages[msgname];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
221 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
222 clone.paramlu = this.paramlu;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
223 clone.params = this.params.slice(0, this.params.length);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
224 clone.returntype = this.returntype;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
225 clone.typeparams = this.typeparams;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
226 return clone;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
227 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
228
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
229 function uniontype(a, b)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
230 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
231 this.a = a;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
232 this.b = b;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
233 this.id = nexttypeid++;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
234 this.satisfies_cache = null;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
235 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
236
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
237 uniontype.prototype.lazyinit = function() {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
238 if (this.satisfies_cache = null) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
239 this.satisfies_cache = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
240 this.satisfies_cache[this.id] = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
241 this.messages = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
242 if (a.messages !== undefined && b.messages !== undefined) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
243 for (var msgname in a.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
244 if (msgname in b.messages) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
245 this.messages[msgname] = mkunion(a.messages[msgname], b.messages[msgname]);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
246 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
247 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
248 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
249 this.callable = false;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
250 if (a.callable && b.callable && a.params.length == b.params.length) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
251 this.callable = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
252 this.params = [];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
253 for (var i = 0; i < a.params.length; i++) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
254 this.params.push(mkunion(a.params[i], b.params[i]));
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
255 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
256 this.returntype = mkunion(a.returntype, b.returntype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
257 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
258 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
259 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
260
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
261 uniontype.prototype.satisfiedBy = function(type)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
262 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
263 this.lazyinit();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
264 if (type.id in this.satisfies_cache) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
265 return this.satisfies_cache[type.id];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
266 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
267 this.satisfies_cache[type.id] = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
268 var ret = this.a.satisfiedBy(type) || this.b.satisfiedBy(type);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
269 this.satisfies_cache[type.id] = ret;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
270 return ret;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
271 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
272
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
273 uniontype.prototype.str = function(indent)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
274 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
275 if (indent === undefined) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
276 indent = '';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
277 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
278 if (indent.length > 6) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
279 return 'max depth reached\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
280 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
281 return indent + 'Union {\n\t' + indent + this.a.str() + '\t' + indent + this.b.str() + indent + '}\n';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
282 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
283
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
284 uniontype.prototype.replaceParams = function(paramtypes, visited) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
285 if (visisted === undefined) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
286 visited = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
287 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
288 if (this.id in visited) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
289 return visited[this.id];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
290 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
291 var me = visited[this.id] = this.clone();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
292 me.a = me.a.replaceParams(paramtypes, visited);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
293 me.b = me.b.replaceParams(paramtypes, visited);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
294 return me;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
295 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
296
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
297 uniontype.prototype.clone = function() {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
298 return new uniontype(this.a, this.b);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
299 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
300
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
301
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
302 function mkunion(a, b)
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
303 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
304 //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
305 if (a.satisfiedBy(b)) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
306 return a;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
307 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
308 //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
309 if (b.satisfiedBy(a)) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
310 return b;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
311 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
312 return new uniontype(a, b);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
313 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
314
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
315 function withtparams(type, params)
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 this.type = type;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
318 this.params = params;
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
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
321 withtparams.prototype.satisfiedBy = function(type) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
322 return this.type.satisfiedBy(type);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
323 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
324
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
325 withtparams.prototype.str = function(indent) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
326 return this.type.str(indent) + indent + '<' + this.params.map(function(p) { return p.str(indent); }).join(', ') + '>';
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
327 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
328
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
329 withtparams.prototype.replaceParams = function(paramtypes) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
330 var replaced = false;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
331 for (var i in this.params) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
332 var newp = this.params[i].replaceParams(paramtypes);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
333 if (newp != this.params[i]) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
334 replaced = true;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
335 this.params[i] = newp;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
336 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
337 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
338 if (replaced) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
339 var childptypes = {};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
340 for (var i in this.type.typeparams) {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
341 childptypes[this.type.typeparams[i]] = this.params[i]
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
342 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
343 this.type = this.type.replaceParams(childptypes, {});
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
344 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
345 return this;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
346 };
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
347
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
348 function typetest()
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
349 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
350 var foo = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
351 var msgtype = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
352 msgtype.addParam('fo');
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
353 msgtype.returntype = foo;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
354 foo.addMessage('bar', msgtype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
355 var baz = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
356 var msgtype2 = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
357 msgtype2.addParam('fo');
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
358 msgtype2.paramType('fo', foo);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
359 msgtype2.returntype = baz;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
360 baz.addMessage('bar', msgtype2);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
361 baz.addMessage('qux', msgtype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
362 var shizzle = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
363 shizzle.addMessage('bar', msgtype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
364 shizzle.addMessage('boo', msgtype);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
365 return {foo: foo, baz: baz, shizzle: shizzle};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
366 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
367
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
368 function paramtypetest()
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
369 {
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
370 var empty = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
371 var tlnode = new objecttype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
372 tlnode.typeparams = ['T'];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
373 var t = new typeparam('T', any);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
374 var q = new typeparam('Q', any);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
375 var head = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
376 head.returnType = t;
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
377 tlnode.addMessage('head', head);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
378 var tail = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
379 var econs = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
380 econs.addParam('val');
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
381 econs.typeparams = ['Q'];
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
382 econs.paramType('val', q);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
383 econs.returntype = new withtparams(tlnode, [q]);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
384 empty.addMessage('cons', econs);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
385 tail.returntype = new uniontype(new withtparams(tlnode, [t]), empty);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
386 tlnode.addMessage('tail', tail);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
387 var cons = new lambdatype();
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
388 cons.addParam('val');
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
389 cons.paramType('val', t);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
390 cons.returntype = new withtparams(tlnode, [t]);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
391 tlnode.addMessage('cons', cons);
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
392 return {empty: empty, tlnode: tlnode};
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
393 }
b58b19c455ec Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
394