use newDynamic() everywhere instead of { i: ... , t: ... }
This commit is contained in:
parent
34d06aa82a
commit
e1a2139cb4
22 changed files with 141 additions and 124 deletions
|
|
@ -7,6 +7,7 @@ import { getSymbol } from "../primitives/type.js";
|
|||
import { TYPE_VARS } from "../primitives/typevars.js";
|
||||
import { dictType, fnType, lsType, prodType, sumType } from "../structures/type_constructors.types.js";
|
||||
import { setType } from "../structures/type_constructors.types.js";
|
||||
import { prettyT } from "../util/pretty.js";
|
||||
|
||||
// A very stupid little parser, that can only parse:
|
||||
// - primitives => simply maps onto types.
|
||||
|
|
@ -126,12 +127,12 @@ export const makeTypeParser = ({
|
|||
}
|
||||
}
|
||||
|
||||
const parseGroup = (tokensInGroup, fn, labels, label) => {
|
||||
const parseGroup = (expr, tokensInGroup, fn, labels, label) => {
|
||||
// console.log('parseGroup ', tokensInGroup, fn);
|
||||
return (fn === null)
|
||||
? __parse(tokensInGroup, labels, label)
|
||||
? __parse(expr, tokensInGroup, labels, label)
|
||||
: fn(self => {
|
||||
return __parse(tokensInGroup, extendLabels(labels, label, self));
|
||||
return __parse(expr, tokensInGroup, extendLabels(labels, label, self));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -139,7 +140,7 @@ export const makeTypeParser = ({
|
|||
return (label === null) ? labels : new Map([...labels, [label, self]])
|
||||
};
|
||||
|
||||
const __parse = (tokens, labels = new Map(), label = null) => {
|
||||
const __parse = (expr, tokens, labels = new Map(), label = null) => {
|
||||
// console.log('parse ', tokens);
|
||||
if (tokens[0].startsWith('#')) {
|
||||
if (labels.has(tokens[0])) {
|
||||
|
|
@ -147,7 +148,7 @@ export const makeTypeParser = ({
|
|||
}
|
||||
else {
|
||||
// pass label and parse 'rest'
|
||||
return __parse(tokens.slice(1), labels, tokens[0]);
|
||||
return __parse(expr, tokens.slice(1), labels, tokens[0]);
|
||||
}
|
||||
}
|
||||
if (tokens.length === 1) {
|
||||
|
|
@ -156,26 +157,28 @@ export const makeTypeParser = ({
|
|||
else {
|
||||
const [lhsTokens, fnGrp, rest] = consumeGroup(tokens);
|
||||
if (rest.length === 0) {
|
||||
return parseGroup(lhsTokens, fnGrp, labels, label);
|
||||
return parseGroup(expr, lhsTokens, fnGrp, labels, label);
|
||||
}
|
||||
const [operator, ...rhsTokens] = rest;
|
||||
for (const [operatorChar, fn] of infixOperators) {
|
||||
if (operator === operatorChar) {
|
||||
return fn
|
||||
(self => {
|
||||
return parseGroup(lhsTokens, fnGrp, extendLabels(labels, label, self));
|
||||
return parseGroup(expr, lhsTokens, fnGrp, extendLabels(labels, label, self));
|
||||
})(self => {
|
||||
return __parse(rhsTokens, extendLabels(labels, label, self));
|
||||
return __parse(expr, rhsTokens, extendLabels(labels, label, self));
|
||||
});
|
||||
}
|
||||
}
|
||||
throw new Error("unknown operator: "+operator)
|
||||
throw new Error("unknown operator: "+operator+" in expression "+expr)
|
||||
}
|
||||
};
|
||||
|
||||
const parse = expr => {
|
||||
const tokens = tokenize(expr);
|
||||
return __parse(tokens);
|
||||
const parsed = __parse(expr, tokens);
|
||||
prettyT(parsed); // force evaluation
|
||||
return parsed;
|
||||
}
|
||||
|
||||
return parse;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue