fez-lisp 1.5.186 → 1.5.187
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/baked/std-T.js +1 -1
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +35 -32
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -159,53 +159,53 @@ export const setPropToCollection = (stats, prop) => {
|
|
159
159
|
)
|
160
160
|
}
|
161
161
|
export const setProp = (stats, prop, value) => {
|
162
|
-
|
162
|
+
if (
|
163
163
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
164
164
|
value[prop][0] !== UNKNOWN &&
|
165
|
-
value[prop][0] !== ANY
|
166
|
-
|
167
|
-
|
168
|
-
|
165
|
+
value[prop][0] !== ANY
|
166
|
+
) {
|
167
|
+
stats[prop][0] = value[prop][0]
|
168
|
+
if (value[prop][1]) stats[prop][1] = value[prop][1]
|
169
|
+
}
|
169
170
|
}
|
170
171
|
export const setPropToReturn = (stats, prop, value) => {
|
171
|
-
|
172
|
+
if (
|
172
173
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
173
174
|
value[RETURNS][0] !== UNKNOWN &&
|
174
|
-
value[RETURNS][0] !== ANY
|
175
|
-
|
176
|
-
|
177
|
-
|
175
|
+
value[RETURNS][0] !== ANY
|
176
|
+
) {
|
177
|
+
stats[prop][0] = value[RETURNS][0]
|
178
|
+
if (value[RETURNS][1]) stats[prop][1] = value[RETURNS][1]
|
179
|
+
}
|
178
180
|
}
|
179
181
|
export const setPropToReturnRef = (stats, prop, value) => {
|
180
|
-
|
182
|
+
if (
|
181
183
|
stats[prop] &&
|
182
184
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
183
185
|
value[RETURNS][0] !== UNKNOWN &&
|
184
|
-
value[RETURNS][0] !== ANY
|
185
|
-
(stats[prop] = value[RETURNS])
|
186
|
+
value[RETURNS][0] !== ANY
|
186
187
|
)
|
188
|
+
stats[prop] = value[RETURNS]
|
187
189
|
}
|
188
190
|
export const setPropToType = (stats, prop, value) => {
|
189
|
-
|
191
|
+
if (
|
190
192
|
stats[prop] &&
|
191
193
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
192
|
-
value[TYPE_PROP][0] !== ANY
|
193
|
-
|
194
|
-
|
195
|
-
|
194
|
+
value[TYPE_PROP][0] !== ANY
|
195
|
+
) {
|
196
|
+
stats[prop][0] = value[TYPE_PROP][0]
|
197
|
+
if (value[TYPE_PROP][1]) stats[prop][1] = value[TYPE_PROP][1]
|
198
|
+
}
|
196
199
|
}
|
197
200
|
export const setPropToTypeRef = (stats, prop, value) => {
|
198
|
-
|
199
|
-
stats[prop]
|
200
|
-
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
201
|
-
(stats[prop] = value[TYPE_PROP])
|
202
|
-
)
|
201
|
+
if (stats[prop] && (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY))
|
202
|
+
stats[prop] = value[TYPE_PROP]
|
203
203
|
}
|
204
204
|
export const setReturnToAtom = (stats) => {
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
205
|
+
if (isUnknownReturn(stats) || isAnyReturn(stats)) {
|
206
|
+
stats[RETURNS][0] = ATOM
|
207
|
+
stats[RETURNS][1] = NUMBER_SUBTYPE()
|
208
|
+
}
|
209
209
|
}
|
210
210
|
export const setTypeToAtom = (stats) =>
|
211
211
|
(isUnknownType(stats) || isAnyType(stats)) &&
|
@@ -238,6 +238,7 @@ export const setTypeToReturnRef = (stats, value) => {
|
|
238
238
|
// Change main type if unknown
|
239
239
|
if (isUnknownType(stats) || isAnyType(stats))
|
240
240
|
if (!isUnknownReturn(value)) stats[TYPE_PROP][0] = value[RETURNS][0]
|
241
|
+
// TODO: Figure out what we do if generic thigns get infered
|
241
242
|
// cange sub type if it doesn't have
|
242
243
|
if (!hasSubType(stats) || getSubType(stats).has(UNKNOWN))
|
243
244
|
if (hasSubReturn(value)) stats[TYPE_PROP][1] = value[RETURNS][1]
|
@@ -1590,7 +1591,7 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
|
|
1590
1591
|
// type check
|
1591
1592
|
// TODO get rof pred type
|
1592
1593
|
// const PRED_TYPE = args[i][STATS][TYPE_PROP][1]
|
1593
|
-
const MAIN_TYPE = getType(args[i][STATS])
|
1594
|
+
const MAIN_TYPE = getType(args[i][STATS], rest[i])
|
1594
1595
|
if (MAIN_TYPE === ANY) continue
|
1595
1596
|
if (first[TYPE] === APPLY) {
|
1596
1597
|
if (isLeaf(rest[i])) {
|
@@ -1746,11 +1747,13 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
|
|
1746
1747
|
!equalSubTypes(args[i][STATS], env[name][STATS]))
|
1747
1748
|
)
|
1748
1749
|
setType(env[name][STATS], args[i][STATS])
|
1749
|
-
else if (
|
1750
|
-
!isUnknownType(args[i][STATS]) &&
|
1751
|
-
isUnknownType(env[name][STATS])
|
1752
|
-
) {
|
1750
|
+
else if (isUnknownType(env[name][STATS])) {
|
1753
1751
|
// REFF ASSIGMENT
|
1752
|
+
// EXPLAIN: Not asigning ref fixes this overwritting
|
1753
|
+
// (let sum (lambda testxs (+ (get testxs 0) (get testxs 1))))
|
1754
|
+
// (let range (math:range 1 10))
|
1755
|
+
// (sum range)
|
1756
|
+
// But it reduces good inference too
|
1754
1757
|
if (getType(args[i][STATS]) !== APPLY)
|
1755
1758
|
setTypeRef(env[name][STATS], args[i][STATS])
|
1756
1759
|
else setStatsRef(env[rest[i][VALUE]], args[i])
|