[xquery-talk] How much laziness is permitted?
John Snelson
john.snelson at oracle.com
Wed Mar 11 17:41:05 PST 2009
Florent Georges wrote:
> John Snelson wrote:
>> As it turns out, try/catch is actually a blocking operation
>> on lazy evaluation. If a lazily evaluated expression inside
>> a try/catch block returns (1, 2, 3) but then raises an
>> error, the implementation effectively needs to
>> "recall" the values (1, 2, 3) and instead return
>> the value of the catch expression. Since most lazy
>> implementations won't have the ability to
>> "recall" values already returned, this means they
>> can't return any values until expression evaluation has
>> terminated - in other words, they need to evaluate eagerly.
>
> I have some difficulties understanding the problem. Could you provide me with a little sample or pseudo code showing such a situation?
try { 1, 2, 3, error() } catch * { "doh!" }
Typically, lazy evaluation will start returning items from expressions
one by one as they are requested. So lets say I request an item from the
expression above, and it gives me 1. I do this a couple more times and
it gives me 2 and 3. Then the next time I request an item, the error()
function raises an error - and the implementation says "Oh - wait a
minute! Give me back those answers, I didn't mean them - I meant to
return 'doh!'.".
In short, if there's a possibility that the try expression could raise
an error, the try/catch block must fully evaluate it to see if an error
occurs before it can return any values. So lazy evaluation has been
"blocked" by the try/catch, and the expression has in practice been
evaluated eagerly.
John
--
John Snelson, Oracle Corporation http://snelson.org.uk/john
Berkeley DB XML: http://oracle.com/database/berkeley-db/xml
XQilla: http://xqilla.sourceforge.net
More information about the talk
mailing list