On 2024-02-10 11:53, Pietro Cerutti wrote:
I don't see why vector-ref would be any less pure than, say, a let
binding. Or do you mean vector-set! ?
vector-ref, applied to a global, could return different values even when
called with the same arguments. Between calls, some other code could
modify the contents of the vector. So according to referential
transparency, vector-ref could not be pure. Likewise a function that
calls vector-ref could not be pure.
Further, according to referential transparency no procedure that *reads*
a global (not just vectors -- even imediate values like numbers,
booleans) can be pure. It might return different values if impure code
modifies the global between calls to the procedure in question.
In contrast, a let binding can only be modified by the code in the
current scope.
There should still be a way to communicate to the optimizer that
vector-ref, or some procedure that uses vector-ref on a global
identifier (but does not call set! / vector-set! on globals) does not,
uh, modify any globals.
-- Al