evaluate(expression, values = new Set()) {
		const current = current_evaluations.get(expression);
		if (current) return current;

		return new Evaluation(this, expression, values);
	}
Does partial evaluation to find an exact value or at least the rough type of the expression.
Only call this once scope has been fully generated in a first pass,
else this evaluates on incomplete data and may yield wrong results.
@param {Expression} expression
@param {Set<any>} [values]