POLA fetch

to fetch( key, absentThunk )

The  protocol for collections does not obey POLA:


 * The collection gets access to the value of absentThunk.
 * The collection may invoke absentThunk and yet return something else.
 * The collection may invoke absentThunk more than once, or after fetch returns.

Proposals

 * Make the second argument usually an ejector. Ejectors do not return values and are robust against being invoked multiple times; if some other sort of object is being used, its author is more likely to consider the multiple invocation issue. If we do this, then utilities should be provided for default-value behavior. --Kevin Reid 11:25, 12 April 2008 (CDT)

Scribbles
def value := map.fetch(key, fn {               map[key] := makeValue              }) def value := escape e { map.fetch(key, e)             } catch _ { map[key] := makeValue } def value := switch (map.fetch(key)) { match [value] { value } match [] { map[key] := makeValue } } def value := switch (map.fetch(key)) { match just(value) { value } match nothing  { map[key] := makeValue } }
 * 1) Current example (ensuring FlexMap entry, has the POLA problem discussed here)
 * 1) works with existing fetch implementations
 * 1) return-value-distinguishing #1
 * 1) return-value-distinguishing #2, using call-patterns and Haskell-style Maybe