# Referential transparency

This is just the principle of a one-time binding of values (or the principle of a single assignment) - Once bound symbols cannot be rebound. For each new value a corresponding new building (to a new symbol) must be done.

Since in a functional language everything is a type-tagged value (including procedures and other expressions) the principle is uniform.

This notion is deeply related to Math, where each occurrence of the same symbol (like `3`) which stands for the same Number is assumed to be a reference to exactly the same abstract entity (concept). Math is referentially transparent.

The consequence of this principle is that an expression could be substituted to a value it reduces into and vice versa.

Since any expression always evaluates to the same value, values can be cached indefinitely, so big expressions need not to be re-evaluated (the result will always be the same).

Because of this, the order of evaluation of compound expressions does not matter - each sub-expression will be reduced to exactly the same value no matter when it is called.

There is no notion of time.