[DONE] while, if statements => with scope to intercept effects
[DONE] tuples => accessing an element by index returns something of type unknown (as the index can be an expression)
[DONE] short-circuit => custom "and" and "or" operators. Infer the most precise type from the two operands.
[98%] for comprehension => custom range operator to join evidence based on the break condition. What about the if inside a for comprehension?
- I had to remove several optimizations where I not introduce ascriptions if the type of the value is the same as the type of
the variable. This is because the type of the variable is not always the most precise type. I need to find a way to introduce
ascriptions only when the type is the same as the expected type.
This is due to Python's limitation regarding overriding certain operations.
- Similarly, Boolop optimization is disabled, currently we need every operand to be ascribed to be able to join evidence with __land__ and __lor__ functions

---------------
- Inference de tipos en clases mutuamente dependientes
- None values y tipos (nulls)?
- N-ary functions (int, int, int) => unit :: ? :: (int, ?) => unit should be accepted?
if not then what is the evidence of  e |- ? ~ ?.
Maybe we just need to have extensible tuples. What about (x, *args) signatures? Here *args is typed tuple[?,...]