use newDynamic() everywhere instead of { i: ... , t: ... }

This commit is contained in:
Joeri Exelmans 2025-05-08 23:56:58 +02:00
parent 34d06aa82a
commit e1a2139cb4
22 changed files with 141 additions and 124 deletions

View file

@ -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;