fez-lisp 1.6.52 → 1.6.53
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/lib/baked/std-T.js +1 -1
- package/package.json +1 -1
- package/src/check.js +76 -123
- package/src/types.js +59 -23
package/lib/baked/std-T.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export default [[[0,"let"],[1,"math:reverse"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:map"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:select"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:exclude"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:fold"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:enumerated-fold"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:every?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:some?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-every?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-some?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-select"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:enumerated-exclude"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:log-taylor-series"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:collatz"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:maximum-index"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:minimum-index"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-def"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-get"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-set!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-del!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-set-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-increment!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-decrement!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-increment-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-decrement-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-add!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-subtract!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-multiply!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-divide!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-add-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-subtract-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-multiply-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-divide-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:max-sub-array-sum"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:median"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:mean"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:subset"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:permutations"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:combinations"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:combinations-n"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:variants"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:unique"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:divisors"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:remove-leading-zeroes"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:sort"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"var:def"],[[0,"lambda"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:get"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"var:set!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:del!"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:set-and-get!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:first"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:second"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:third"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:last"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:get"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:get-number"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:get-array"],[[0,"lambda"],[1,"Unknown[][]"],[1,"Number"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"array:get-boolean"],[[0,"lambda"],[1,"Boolean[]"],[1,"Number"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"array:transform"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown[]"],[1,"Unknown"],[[0,"do"],[1,"Unknown"]]],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"array:reduce"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Number"],[1,"Unknown"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:enumerated-reduce"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Number"],[1,"Unknown"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:zip"],[[0,"lambda"],[1,"Unknown[]"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"array:push!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown"]]]],[[0,"let"],[1,"array:append!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"array:fold"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown"],[1,"Unknown"],[[0,"do"],[1,"Any"]]],[1,"Unknown"],[[0,"do"],[1,"Unknown"]]]],[[0,"let"],[1,"list:fold"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown"],[1,"Unknown"],[[0,"do"],[1,"Any"]]],[1,"Unknown"],[[0,"do"],[1,"Unknown"]]]],[[0,"let"],[1,"bools:fold"],[[0,"lambda"],[1,"Boolean[]"],[[0,"lambda"],[1,"Boolean"],[1,"Boolean"],[[0,"do"],[1,"Boolean"]]],[1,"Boolean"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"boole:def-strict"],[[0,"lambda"],[1,"Boolean"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:get"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"boole:set!"],[[0,"lambda"],[1,"Boolean[]"],[1,"Boolean"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:toggle!"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:true!"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:false!"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:true?"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"boole:false?"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"from:string->array"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"from:array->string"],[[0,"lambda"],[1,"Unknown[][]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:strings->integers"],[[0,"lambda"],[1,"Unknown[][]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:string->integer"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:integer->string"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:strings->floats"],[[0,"lambda"],[1,"Unknown[][]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:string->float"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:float->string"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:chars->digits"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:digits->chars"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:digits->integer"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:integer->digits"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:chars->set"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Unknown[][]"]]]]]
|
1
|
+
export default [[[0,"let"],[1,"math:reverse"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:map"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:select"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:exclude"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:fold"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:enumerated-fold"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:every?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:some?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-every?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-some?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-select"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:enumerated-exclude"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:log-taylor-series"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:collatz"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:maximum-index"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:minimum-index"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-def"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-get"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-set!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-del!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-set-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-increment!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-decrement!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-increment-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-decrement-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-add!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-subtract!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-multiply!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-divide!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-add-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-subtract-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-multiply-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-divide-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:max-sub-array-sum"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:median"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:mean"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:subset"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:permutations"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:combinations"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:combinations-n"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:variants"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:unique"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:divisors"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:remove-leading-zeroes"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:sort"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"matrix:zeroes"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number[][]"]]]],[[0,"let"],[1,"matrix:ones"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number[][]"]]]],[[0,"let"],[1,"matrix:find-index"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"matrix:points"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[][]"]]]],[[0,"let"],[1,"var:def"],[[0,"lambda"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:get"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"var:set!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:del!"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:set-and-get!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:first"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:second"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:third"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:last"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:get"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:get-number"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:get-nested-number-1"],[[0,"lambda"],[1,"Number[][]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"array:get-nested-number-2"],[[0,"lambda"],[1,"Number[][][]"],[1,"Number"],[[0,"do"],[1,"Number[][]"]]]],[[0,"let"],[1,"array:get-array"],[[0,"lambda"],[1,"Unknown[][]"],[1,"Number"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"array:get-nested-array-1"],[[0,"lambda"],[1,"Unknown[][]"],[1,"Number"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"array:get-nested-array-2"],[[0,"lambda"],[1,"Unknown[][][]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"array:get-boolean"],[[0,"lambda"],[1,"Boolean[]"],[1,"Number"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"array:get-nested-boolean-1"],[[0,"lambda"],[1,"Boolean[][]"],[1,"Number"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"array:get-nested-boolean-2"],[[0,"lambda"],[1,"Boolean[][][]"],[1,"Number"],[[0,"do"],[1,"Boolean[][]"]]]],[[0,"let"],[1,"array:transform"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown[]"],[1,"Unknown"],[[0,"do"],[1,"Unknown"]]],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"array:reduce"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Number"],[1,"Unknown"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:enumerated-reduce"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Number"],[1,"Unknown"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:zip"],[[0,"lambda"],[1,"Unknown[]"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"array:push!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown"]]]],[[0,"let"],[1,"array:append!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"array:fold"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown"],[1,"Unknown"],[[0,"do"],[1,"Any"]]],[1,"Unknown"],[[0,"do"],[1,"Unknown"]]]],[[0,"let"],[1,"list:fold"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown"],[1,"Unknown"],[[0,"do"],[1,"Any"]]],[1,"Unknown"],[[0,"do"],[1,"Unknown"]]]],[[0,"let"],[1,"bools:fold"],[[0,"lambda"],[1,"Boolean[]"],[[0,"lambda"],[1,"Boolean"],[1,"Boolean"],[[0,"do"],[1,"Boolean"]]],[1,"Boolean"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"boole:def-strict"],[[0,"lambda"],[1,"Boolean"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:get"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"boole:set!"],[[0,"lambda"],[1,"Boolean[]"],[1,"Boolean"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:toggle!"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:true!"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:false!"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean[]"]]]],[[0,"let"],[1,"boole:true?"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"boole:false?"],[[0,"lambda"],[1,"Boolean[]"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"from:string->array"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"from:array->string"],[[0,"lambda"],[1,"Unknown[][]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:strings->integers"],[[0,"lambda"],[1,"Unknown[][]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:string->integer"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:integer->string"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:strings->floats"],[[0,"lambda"],[1,"Unknown[][]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:string->float"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:float->string"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:chars->digits"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:digits->chars"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:digits->integer"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:integer->digits"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:chars->set"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Unknown[][]"]]]]]
|
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -45,7 +45,8 @@ import {
|
|
45
45
|
IS_ARGUMENT,
|
46
46
|
NUMBER,
|
47
47
|
NUMBER_SUBTYPE,
|
48
|
-
UNKNOWN_SUBTYPE
|
48
|
+
UNKNOWN_SUBTYPE,
|
49
|
+
SubType
|
49
50
|
} from './types.js'
|
50
51
|
import {
|
51
52
|
Brr,
|
@@ -56,32 +57,7 @@ import {
|
|
56
57
|
logExp,
|
57
58
|
stringifyArgs
|
58
59
|
} from './utils.js'
|
59
|
-
|
60
|
-
const A = this
|
61
|
-
const out = new Set()
|
62
|
-
A.forEach((element) => out.add(element))
|
63
|
-
B.forEach((element) => out.add(element))
|
64
|
-
return out
|
65
|
-
}
|
66
|
-
Set.prototype.xor = function (B) {
|
67
|
-
const A = this
|
68
|
-
const out = new Set()
|
69
|
-
B.forEach((element) => !A.has(element) && out.add(element))
|
70
|
-
A.forEach((element) => !B.has(element) && out.add(element))
|
71
|
-
return out
|
72
|
-
}
|
73
|
-
Set.prototype.intersection = function (B) {
|
74
|
-
const A = this
|
75
|
-
const out = new Set()
|
76
|
-
B.forEach((element) => A.has(element) && out.add(element))
|
77
|
-
return out
|
78
|
-
}
|
79
|
-
Set.prototype.difference = function (B) {
|
80
|
-
const A = this
|
81
|
-
const out = new Set()
|
82
|
-
A.forEach((element) => !B.has(element) && out.add(element))
|
83
|
-
return out
|
84
|
-
}
|
60
|
+
|
85
61
|
export const identity = (name) => [
|
86
62
|
[0, 'let'],
|
87
63
|
[1, name],
|
@@ -289,30 +265,36 @@ export const isUnknownType = (stats) => stats && stats[TYPE_PROP][0] === UNKNOWN
|
|
289
265
|
export const isUnknownProp = (stats, prop) => {
|
290
266
|
return stats && stats[prop][0] === UNKNOWN
|
291
267
|
}
|
292
|
-
|
268
|
+
export const isSubType = (subtype) => subtype instanceof SubType
|
269
|
+
export const isSubTypeUknown = (subtype) =>
|
270
|
+
subtype.size === 1 && subtype.has(UNKNOWN)
|
271
|
+
export const matchSub = (a, b) =>
|
272
|
+
a.has(UNKNOWN) ||
|
273
|
+
b.has(UNKNOWN) ||
|
274
|
+
a.has(ANY) ||
|
275
|
+
b.has(ANY) ||
|
276
|
+
a.isMatching(b)
|
293
277
|
export const isUnknownReturn = (stats) => stats[RETURNS][0] === UNKNOWN
|
294
278
|
export const getType = (stats) => stats && stats[TYPE_PROP][0]
|
295
279
|
export const getTypes = (stats) => stats && stats[TYPE_PROP]
|
296
280
|
export const getReturn = (stats) => stats && stats[RETURNS][0]
|
297
281
|
export const getReturns = (stats) => stats && stats[RETURNS]
|
298
282
|
export const getSubType = (stats) => stats && stats[TYPE_PROP][1]
|
299
|
-
export const hasSubType = (stats) => stats && stats[TYPE_PROP][1]
|
283
|
+
export const hasSubType = (stats) => stats && isSubType(stats[TYPE_PROP][1])
|
300
284
|
export const getSubReturn = (stats) => stats && stats[RETURNS][1]
|
301
|
-
export const hasSubReturn = (stats) => stats && stats[RETURNS][1]
|
285
|
+
export const hasSubReturn = (stats) => stats && isSubType(stats[RETURNS][1])
|
302
286
|
export const isUnknownSubReturn = (stats) =>
|
303
287
|
!hasSubReturn(stats) ||
|
304
288
|
(stats &&
|
305
289
|
stats[RETURNS] &&
|
306
290
|
stats[RETURNS][1] &&
|
307
|
-
stats[RETURNS][1]
|
308
|
-
stats[RETURNS][1].has(UNKNOWN))
|
291
|
+
isSubTypeUknown(stats[RETURNS][1]))
|
309
292
|
export const isUnknownSubType = (stats) =>
|
310
293
|
hasSubType(stats) &&
|
311
294
|
stats &&
|
312
295
|
stats[TYPE_PROP] &&
|
313
296
|
stats[TYPE_PROP][1] &&
|
314
|
-
stats[TYPE_PROP][1]
|
315
|
-
stats[TYPE_PROP][1].has(UNKNOWN)
|
297
|
+
isSubTypeUknown(stats[TYPE_PROP][1])
|
316
298
|
export const isAtomType = (stats) =>
|
317
299
|
isAnyType(stats) || stats[TYPE_PROP][0] === ATOM
|
318
300
|
export const isAtomReturn = (stats) =>
|
@@ -357,35 +339,21 @@ const IsPredicate = (leaf) =>
|
|
357
339
|
|
358
340
|
const equalSubTypes = (a, b) => {
|
359
341
|
return (
|
360
|
-
!hasSubType(a) ||
|
361
|
-
!hasSubType(b) ||
|
362
|
-
getSubType(a).has(UNKNOWN) ||
|
363
|
-
getSubType(b).has(UNKNOWN) ||
|
364
|
-
getSubType(a).has(ANY) ||
|
365
|
-
getSubType(b).has(ANY) ||
|
366
|
-
getSubType(a).difference(getSubType(b)).size === 0
|
342
|
+
!hasSubType(a) || !hasSubType(b) || matchSub(getSubType(a), getSubType(b))
|
367
343
|
)
|
368
344
|
}
|
369
345
|
const equalSubReturns = (a, b) => {
|
370
346
|
return (
|
371
347
|
!hasSubReturn(a) ||
|
372
348
|
!hasSubReturn(b) ||
|
373
|
-
getSubReturn(a)
|
374
|
-
getSubReturn(b).has(UNKNOWN) ||
|
375
|
-
getSubReturn(a).has(ANY) ||
|
376
|
-
getSubReturn(b).has(ANY) ||
|
377
|
-
getSubReturn(a).difference(getSubReturn(b)).size === 0
|
349
|
+
matchSub(getSubReturn(a), getSubReturn(b))
|
378
350
|
)
|
379
351
|
}
|
380
352
|
const equalSubTypesWithSubReturn = (a, b) => {
|
381
353
|
return (
|
382
354
|
!hasSubType(a) ||
|
383
355
|
!hasSubReturn(b) ||
|
384
|
-
getSubType(a)
|
385
|
-
getSubReturn(b).has(UNKNOWN) ||
|
386
|
-
getSubType(a).has(ANY) ||
|
387
|
-
getSubReturn(b).has(ANY) ||
|
388
|
-
getSubType(a).difference(getSubReturn(b)).size === 0
|
356
|
+
matchSub(getSubType(a), getSubReturn(b))
|
389
357
|
)
|
390
358
|
}
|
391
359
|
const isAtomABoolean = (atom) => atom === TRUE || atom === FALSE
|
@@ -542,7 +510,16 @@ const IfApplyBranch = ({
|
|
542
510
|
}
|
543
511
|
break
|
544
512
|
default:
|
545
|
-
|
513
|
+
if (
|
514
|
+
getType(ref[STATS]) === UNKNOWN &&
|
515
|
+
getReturn(branch[STATS]) === UNKNOWN
|
516
|
+
) {
|
517
|
+
retry(ref[STATS], exp, stack, () =>
|
518
|
+
setPropToReturn(ref[STATS], prop, branch[STATS])
|
519
|
+
)
|
520
|
+
return true
|
521
|
+
}
|
522
|
+
return setPropToReturn(ref[STATS], prop, branch[STATS])
|
546
523
|
}
|
547
524
|
}
|
548
525
|
const ifExpression = ({ re, env, ref, prop, stack, exp, check }) => {
|
@@ -554,6 +531,7 @@ const ifExpression = ({ re, env, ref, prop, stack, exp, check }) => {
|
|
554
531
|
const alt = isLeaf(re[1]) ? re[1] : re[1][0]
|
555
532
|
const concequent = env[conc[VALUE]]
|
556
533
|
const alternative = env[alt[VALUE]]
|
534
|
+
|
557
535
|
// TODO make this more simple - it's so many different things just because types are functions or not
|
558
536
|
// WHY not consider making return types for everything
|
559
537
|
if (concequent)
|
@@ -635,7 +613,7 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
635
613
|
const right = isLeaf(rest.at(-1)) ? rest.at(-1) : rest.at(-1)[0]
|
636
614
|
const currentSubType = hasSubType(current[STATS])
|
637
615
|
? getSubType(current[STATS])
|
638
|
-
: new
|
616
|
+
: new SubType([UNKNOWN])
|
639
617
|
switch (right[TYPE]) {
|
640
618
|
case ATOM:
|
641
619
|
if (
|
@@ -659,7 +637,7 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
659
637
|
if (env[right[VALUE]]) {
|
660
638
|
if (hasSubType(env[right[VALUE]][STATS])) {
|
661
639
|
if (currentSubType.has(UNKNOWN))
|
662
|
-
current[STATS][TYPE_PROP][1] = new
|
640
|
+
current[STATS][TYPE_PROP][1] = new SubType([
|
663
641
|
...getSubType(env[right[VALUE]][STATS])
|
664
642
|
])
|
665
643
|
else if (!equalSubTypes(current[STATS], env[right[VALUE]][STATS]))
|
@@ -672,7 +650,7 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
672
650
|
getTypes(env[right[VALUE]][STATS])
|
673
651
|
)}) (${stringifyArgs([first, rest])}) (check #198)`
|
674
652
|
)
|
675
|
-
current[STATS][TYPE_PROP][1] = new
|
653
|
+
current[STATS][TYPE_PROP][1] = new SubType(
|
676
654
|
getSubType(env[right[VALUE]][STATS])
|
677
655
|
)
|
678
656
|
} else
|
@@ -692,7 +670,7 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
692
670
|
}
|
693
671
|
if (hasSubReturn(env[right[VALUE]][STATS])) {
|
694
672
|
if (currentSubType.has(UNKNOWN))
|
695
|
-
current[STATS][TYPE_PROP][1] = new
|
673
|
+
current[STATS][TYPE_PROP][1] = new SubType([
|
696
674
|
...getSubReturn(env[right[VALUE]][STATS])
|
697
675
|
])
|
698
676
|
else if (
|
@@ -710,7 +688,7 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
710
688
|
getReturns(env[right[VALUE]][STATS])
|
711
689
|
)}) (${stringifyArgs([first, rest])}) (check #198)`
|
712
690
|
)
|
713
|
-
current[STATS][TYPE_PROP][1] = new
|
691
|
+
current[STATS][TYPE_PROP][1] = new SubType([
|
714
692
|
...getSubReturn(env[right[VALUE]][STATS])
|
715
693
|
])
|
716
694
|
}
|
@@ -729,81 +707,52 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
729
707
|
// )
|
730
708
|
}
|
731
709
|
}
|
732
|
-
const
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
} else return false
|
753
|
-
break
|
754
|
-
case WORD:
|
755
|
-
{
|
756
|
-
if (hasSubType(env[array[VALUE]][STATS])) {
|
757
|
-
const rightSub = getSubType(env[array[VALUE]][STATS])
|
758
|
-
const isAtom =
|
759
|
-
rightSub.has(ATOM) || rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
|
760
|
-
const isCollection = rightSub.has(COLLECTION)
|
761
|
-
if (isAtom && !isCollection) {
|
762
|
-
setPropToAtom(env[name][STATS], prop)
|
763
|
-
setPropToSubType(env[name][STATS], prop, env[array[VALUE]][STATS])
|
764
|
-
} else if (!isAtom && isCollection) {
|
765
|
-
setPropToType(env[name][STATS], prop, env[array[VALUE]][STATS])
|
766
|
-
// TODO: handle this nested array overwrite better
|
767
|
-
if (getSubType(env[array[VALUE]][STATS]).has(COLLECTION))
|
768
|
-
setPropToSubType(env[name][STATS], prop, {
|
769
|
-
[TYPE_PROP]: [COLLECTION, UNKNOWN_SUBTYPE()]
|
770
|
-
})
|
771
|
-
} else return false
|
772
|
-
} else return false
|
773
|
-
}
|
774
|
-
break
|
775
|
-
}
|
776
|
-
return true
|
710
|
+
const initArrayTypeRec = ({ rem, env }) => {
|
711
|
+
return rem.slice(1).map((x) =>
|
712
|
+
isLeaf(x)
|
713
|
+
? x[TYPE] === WORD
|
714
|
+
? env[x[VALUE]]
|
715
|
+
? // env[x[VALUE]][STATS][TYPE_PROP][0] === COLLECTION
|
716
|
+
// ? initArrayTypeRec({ rem: x, env })
|
717
|
+
// :
|
718
|
+
getTypes(env[x[VALUE]][STATS])
|
719
|
+
: [UNKNOWN]
|
720
|
+
: [
|
721
|
+
x[TYPE],
|
722
|
+
x[TYPE] === ATOM ? NUMBER_SUBTYPE() : new SubType([UNKNOWN])
|
723
|
+
]
|
724
|
+
: env[x[0][VALUE]]
|
725
|
+
? x.length > 1 && env[x[0][VALUE]][STATS][RETURNS][0] === COLLECTION
|
726
|
+
? initArrayTypeRec({ rem: x, env })
|
727
|
+
: getReturns(env[x[0][VALUE]][STATS])
|
728
|
+
: [UNKNOWN]
|
729
|
+
)
|
777
730
|
}
|
778
731
|
const initArrayType = ({ rem, env }) => {
|
779
|
-
const ret = rem
|
780
|
-
.slice(1)
|
781
|
-
.map((x) =>
|
782
|
-
isLeaf(x)
|
783
|
-
? x[TYPE] === WORD
|
784
|
-
? env[x[VALUE]]
|
785
|
-
? getTypes(env[x[VALUE]][STATS])
|
786
|
-
: [UNKNOWN]
|
787
|
-
: [x[TYPE], x[TYPE] === ATOM ? NUMBER_SUBTYPE() : new Set([UNKNOWN])]
|
788
|
-
: env[x[0][VALUE]]
|
789
|
-
? getReturns(env[x[0][VALUE]][STATS])
|
790
|
-
: [UNKNOWN]
|
791
|
-
)
|
732
|
+
const ret = initArrayTypeRec({ rem, env })
|
792
733
|
const known = ret.find((x) => x[0] !== ANY && x[0] !== UNKNOWN)
|
793
|
-
|
794
|
-
|
795
|
-
ret
|
796
|
-
|
797
|
-
|
734
|
+
// console.log(known[0], ret[0])
|
735
|
+
if (known && ret.length) {
|
736
|
+
if (Array.isArray(ret[0][0])) {
|
737
|
+
let head = ret[0][0]
|
738
|
+
ret[0].length = 0
|
739
|
+
const subT = new SubType([COLLECTION])
|
740
|
+
ret[0].push(COLLECTION, subT)
|
741
|
+
while (head && !isSubType(head[1])) {
|
742
|
+
subT.add(COLLECTION)
|
743
|
+
head = head[0]
|
744
|
+
}
|
745
|
+
if (head) subT.add(head[1].types[0])
|
746
|
+
}
|
798
747
|
const [main, sub] = ret[0]
|
799
748
|
return {
|
800
749
|
[TYPE_PROP]: [APPLY],
|
801
|
-
[RETURNS]: [COLLECTION, new
|
750
|
+
[RETURNS]: [COLLECTION, new SubType(isSubType(sub) ? [...sub] : [main])]
|
802
751
|
}
|
803
752
|
} else
|
804
753
|
return {
|
805
754
|
[TYPE_PROP]: [APPLY],
|
806
|
-
[RETURNS]: [COLLECTION, new
|
755
|
+
[RETURNS]: [COLLECTION, new SubType([UNKNOWN])]
|
807
756
|
}
|
808
757
|
}
|
809
758
|
const resolveReturnType = ({
|
@@ -1386,8 +1335,11 @@ export const typeCheck = (
|
|
1386
1335
|
: env[right[VALUE]] == undefined
|
1387
1336
|
? UNKNOWN
|
1388
1337
|
: env[right[VALUE]][STATS][RETURNS][0]
|
1389
|
-
|
1338
|
+
|
1339
|
+
if (type !== UNKNOWN && type !== ANY) {
|
1390
1340
|
setTypeToReturn(env[name][STATS], env[right[VALUE]][STATS])
|
1341
|
+
}
|
1342
|
+
|
1391
1343
|
const resolve = () => {
|
1392
1344
|
const body = rightHand
|
1393
1345
|
const rem = hasBlock(body) ? body.at(-1) : body
|
@@ -1404,6 +1356,7 @@ export const typeCheck = (
|
|
1404
1356
|
})
|
1405
1357
|
}
|
1406
1358
|
resolve()
|
1359
|
+
|
1407
1360
|
if (isUnknownType(env[name][STATS]))
|
1408
1361
|
once(env[name][STATS], exp, stack, () => resolve())
|
1409
1362
|
}
|
package/src/types.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
import stdT from '../lib/baked/std-T.js'
|
2
2
|
import std from '../lib/baked/std.js'
|
3
|
-
import { getReturn, getReturns, getType, getTypes } from './check.js'
|
3
|
+
import { getReturn, getReturns, getType, getTypes, isSubType } from './check.js'
|
4
4
|
import {
|
5
5
|
APPLY,
|
6
6
|
ATOM,
|
@@ -36,11 +36,45 @@ export const IS_ARGUMENT = 'is_arg'
|
|
36
36
|
export const NIL = 'nil'
|
37
37
|
export const TRUE_WORD = 'true'
|
38
38
|
export const FALSE_WORD = 'false'
|
39
|
-
export
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
export class SubType {
|
40
|
+
constructor(args) {
|
41
|
+
this.types = []
|
42
|
+
this.types.push(...args)
|
43
|
+
}
|
44
|
+
add(type) {
|
45
|
+
this.types.push(type)
|
46
|
+
return this
|
47
|
+
}
|
48
|
+
has(type) {
|
49
|
+
return this.types[0] === type
|
50
|
+
}
|
51
|
+
isMatching(b) {
|
52
|
+
for (let i = 0; i < this.types.length; ++i) {
|
53
|
+
if (
|
54
|
+
this.types[i] == undefined ||
|
55
|
+
b.types[i] == undefined ||
|
56
|
+
this.types[i] === UNKNOWN ||
|
57
|
+
b.types[i] === UNKNOWN ||
|
58
|
+
this.types[i] === ANY ||
|
59
|
+
b.types[i] === ANY
|
60
|
+
)
|
61
|
+
return true
|
62
|
+
if (this.types[i] !== b.types[i]) return false
|
63
|
+
}
|
64
|
+
return true
|
65
|
+
}
|
66
|
+
get size() {
|
67
|
+
return this.types.length
|
68
|
+
}
|
69
|
+
*[Symbol.iterator]() {
|
70
|
+
for (let i = 0, len = this.size; i < len; ++i) yield this.types[i]
|
71
|
+
}
|
72
|
+
}
|
73
|
+
export const BOOLEAN_SUBTYPE = () => new SubType([BOOLEAN])
|
74
|
+
export const COLLECTION_SUBTYPE = () => new SubType([COLLECTION])
|
75
|
+
export const NUMBER_SUBTYPE = () => new SubType([NUMBER])
|
76
|
+
export const ABSTRACTION_SUBTYPE = () => new SubType([APPLY])
|
77
|
+
export const UNKNOWN_SUBTYPE = () => new SubType([UNKNOWN])
|
44
78
|
|
45
79
|
const SPECIAL_BOOLEAN = BOOLEAN_SUBTYPE()
|
46
80
|
const SPECIAL_COLLECTION = COLLECTION_SUBTYPE()
|
@@ -82,18 +116,22 @@ export const toTypeCodes = (type) => {
|
|
82
116
|
return [UNKNOWN]
|
83
117
|
case 'Unknown[]':
|
84
118
|
case 'Unknowns':
|
85
|
-
|
86
|
-
return [COLLECTION, new
|
119
|
+
// case 'Collection':
|
120
|
+
return [COLLECTION, new SubType([ANY])]
|
87
121
|
case 'Numbers':
|
88
122
|
case 'Number[]':
|
89
123
|
return [COLLECTION, NUMBER_SUBTYPE()]
|
90
124
|
case 'Booleans':
|
91
125
|
case 'Boolean[]':
|
92
126
|
return [COLLECTION, BOOLEAN_SUBTYPE()]
|
93
|
-
case 'Collections':
|
94
|
-
case 'Collection[]':
|
127
|
+
// case 'Collections':
|
128
|
+
// case 'Collection[]':
|
95
129
|
case 'Unknown[][]':
|
96
130
|
return [COLLECTION, COLLECTION_SUBTYPE()]
|
131
|
+
case 'Boolean[][]':
|
132
|
+
return [COLLECTION, new SubType([COLLECTION, BOOLEAN])]
|
133
|
+
case 'Number[][]':
|
134
|
+
return [COLLECTION, new SubType([COLLECTION, NUMBER])]
|
97
135
|
case 'Any':
|
98
136
|
return [ANY]
|
99
137
|
default:
|
@@ -954,7 +992,7 @@ export const SPECIAL_FORM_TYPES = {
|
|
954
992
|
}
|
955
993
|
}
|
956
994
|
],
|
957
|
-
// [GENERIC, new
|
995
|
+
// [GENERIC, new SubType([PLACEHOLDER]), 0]
|
958
996
|
[RETURNS]: [COLLECTION]
|
959
997
|
}
|
960
998
|
},
|
@@ -1307,20 +1345,18 @@ export const formatSubType = (T) => {
|
|
1307
1345
|
switch (T[0]) {
|
1308
1346
|
case COLLECTION:
|
1309
1347
|
return `${
|
1310
|
-
T[1]
|
1311
|
-
?
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
)
|
1317
|
-
.join(' ') || toTypeNames(UNKNOWN)
|
1348
|
+
isSubType(T[1])
|
1349
|
+
? T[1].has(COLLECTION)
|
1350
|
+
? `${toTypeNamesAnyToUknown(T[1].types.at(-1))}${'[]'.repeat(
|
1351
|
+
T[1].types.length - 1
|
1352
|
+
)}`
|
1353
|
+
: toTypeNamesAnyToUknown(T[1].types[0]) || toTypeNames(UNKNOWN)
|
1318
1354
|
: toTypeNames(UNKNOWN)
|
1319
1355
|
}[]`
|
1320
1356
|
case ATOM:
|
1321
1357
|
return `${
|
1322
|
-
T[1]
|
1323
|
-
?
|
1358
|
+
isSubType(T[1])
|
1359
|
+
? toTypeNamesAnyToUknown(T[1].types[0])
|
1324
1360
|
: toTypeNamesAnyToUknown(NUMBER)
|
1325
1361
|
}`
|
1326
1362
|
default:
|
@@ -1378,7 +1414,7 @@ export const formatAstSubType = (T) => {
|
|
1378
1414
|
switch (T[0]) {
|
1379
1415
|
case COLLECTION:
|
1380
1416
|
return `${
|
1381
|
-
T[1]
|
1417
|
+
isSubType(T[1])
|
1382
1418
|
? [...T[1]]
|
1383
1419
|
.map((x) =>
|
1384
1420
|
x === COLLECTION
|
@@ -1390,7 +1426,7 @@ export const formatAstSubType = (T) => {
|
|
1390
1426
|
}[]`
|
1391
1427
|
case ATOM:
|
1392
1428
|
return `${
|
1393
|
-
T[1]
|
1429
|
+
isSubType(T[1])
|
1394
1430
|
? [...T[1]].map((x) => toTypeNamesAnyToUknown(x)).join(' ')
|
1395
1431
|
: toTypeNamesAnyToUknown(NUMBER)
|
1396
1432
|
}`
|