When a program has a free variable, we can consider an entire space of possible execution paths, one for each possible value the variable could take.
Or we could put on a greasy old pragmatic ball cap and issue an "unbound variable in line 42" error.
A free free variable has no "possible value". If a variable has a value, it has a binding; if it has a binding, it is not a free variable.
If we suspect that the variable is not actually free, but rather its definition has not yet appeared, we can defer the processing. Perhaps capture a continuation of the symbolic execution machine, and dispatch it later.
If the expression which refers to the free variable is not actually evaluated (as our symbolic execution shows), we can squelch the warning, or change its wording.
The idea that a free variable is implicitly universally quantified works in logic, but it doesn't transfer to an ordinary programming language (i.e. not Prolog, and its ilk) very well.
Or we could put on a greasy old pragmatic ball cap and issue an "unbound variable in line 42" error.
A free free variable has no "possible value". If a variable has a value, it has a binding; if it has a binding, it is not a free variable.
If we suspect that the variable is not actually free, but rather its definition has not yet appeared, we can defer the processing. Perhaps capture a continuation of the symbolic execution machine, and dispatch it later.
If the expression which refers to the free variable is not actually evaluated (as our symbolic execution shows), we can squelch the warning, or change its wording.
The idea that a free variable is implicitly universally quantified works in logic, but it doesn't transfer to an ordinary programming language (i.e. not Prolog, and its ilk) very well.