I introduced an incompatibility in regex11 (1.3.3)

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
16 messages Options
Reply | Threaded
Open this post in threaded view
|

I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-2

Terry Raymond sent me a message that at first confused me:

I found a bug in regex11 and traced it back to your change;

Regex11 (1.3.1-soops1,reinz)  Development.

 

| matches testString |

testString := '15'.

matches := OrderedCollection new.

'([1-9]|1[0-9])' asRegex

                               matchesIn: testString

                               do:       [:each |

                                             matches add: each.].

matches

 

Your version results in  OrderedCollection ('15')

Previous version result   OrderedCollection ('1' '5')

 

Checking against  http://regex101.com/ I get global matches

1

5

 



It turns out that in regular language theory the 'alternatives' construct does not prefer left branch above right branch (=greedy), but that in most popular regex implementations it does prefer the first match (=eager).
I always thought that regex expressions as a whole are meant to be greedy and that is why I introduced this patch.

Looking a bit further I found this comparison page:
  http://www.regular-expressions.info/refbasic.html
The 'Alternation is greedy' entry is about this feature. It turns out that I am not alone in my expectations: POSIX ERE, Gnu BRE and Gnu ERE also use a greedy implementation while all other libraries listed there use the eager variant.

We now have a regex in the field, that is incompatible with the most popular regex libraries but that in my opinion creates more predictable results.
For example predict what part of the string will be matched by 'our' regex11 vs the regex101.com site in the following case:
  '.*(ABCD|BC)' asRegex matches: 'fooABCD'
(no cheating: first predict, then try :-)

I like this predictability so I would like to keep it in, but it may turn out to be a major PITA when porting regexen from other languages.

What is your opinion, should this fix be rolled back or should we keep it?


Reinout Heeck
--------------------
[hidden email]

_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Andres Valloud-4
Add a switch?

On 6/11/14 3:15 , Reinout Heeck wrote:

>
> Terry Raymond sent me a message that at first confused me:
>>
>> I found a bug in regex11 and traced it back to your change;
>>
>> Regex11 (1.3.1-soops1,reinz)  Development.
>>
>> | matches testString |
>>
>> testString := '15'.
>>
>> matches := OrderedCollection new.
>>
>> '([1-9]|1[0-9])' asRegex
>>
>>                                matchesIn: testString
>>
>>                                do:  [:each |
>>
>>             matches add: each.].
>>
>> matches
>>
>> Your version results in  OrderedCollection ('15')
>>
>> Previous version result   OrderedCollection ('1' '5')
>>
>> Checking against http://regex101.com/ I get global matches
>>
>> 1
>>
>> 5
>>
>
>
> It turns out that in regular language theory the 'alternatives'
> construct does not prefer left branch above right branch (=greedy), but
> that in most popular regex implementations it does prefer the first
> match (=eager).
> I always thought that regex expressions as a whole are meant to be
> greedy and that is why I introduced this patch.
>
> Looking a bit further I found this comparison page:
> http://www.regular-expressions.info/refbasic.html
> The 'Alternation is greedy' entry is about this feature. It turns out
> that I am not alone in my expectations: POSIX ERE, Gnu BRE and Gnu ERE
> also use a greedy implementation while all other libraries listed there
> use the eager variant.
>
> We now have a regex in the field, that is incompatible with the most
> popular regex libraries but that in my opinion creates more predictable
> results.
> For example predict what part of the string will be matched by 'our'
> regex11 vs the regex101.com site in the following case:
>    '.*(ABCD|BC)' asRegex matches: 'fooABCD'
> (no cheating: first predict, then try :-)
>
> I like this predictability so I would like to keep it in, but it may
> turn out to be a major PITA when porting regexen from other languages.
>
> What is your opinion, should this fix be rolled back or should we keep it?
>
>
> Reinout Heeck
> --------------------
> [hidden email]
_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Anthony Lander-3
In reply to this post by Reinout Heeck-2
Hi Reinout,

Much as I agree with your intuition, I believe you should roll back this change.

The reason the 'old' result is correct is that '.*' is also greedy. In your example matching 'fooABCD' it is '.*' that is consuming as many characters as possible before moving on to the bracketed expression. The greediness (or not) of the alternation never comes into play.

  -Anthony

_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-2
In reply to this post by Andres Valloud-4
On 6/11/2014 12:32 PM, Andres Valloud wrote:
> Add a switch?

Supporting both variants might be done along the following lines:

--subclass RxmBranch as RxmEagerBranch and give it the old/eager
implementation of #matchAgainst:
--subclass RxMatcher as RxEagerMatcher and specialize
#hookBranchOf:onto: to use RxmEagerBranch
--add RxParser class>>preferredEagerMatcherClass to return RxEagerMatcher
--add CharacterArray>>asEagerRegex and #asEagerRegexIgnoringCase

--optimize: the other usages of RxmBranch in RxMatcher are used to
implement the various quantifiers (*,+,{n,m},?), these will probably run
more efficently when they use the RxmEagerBranch.

--Review your code for references to RxMatcher and for sends of #asRegex
and change to eager variants where wanted.


This way compatibility with current code is unaffected while importing
regexen from other environments is made possible.



Thoughts?

R
-


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-2
In reply to this post by Anthony Lander-3
On 6/11/2014 4:07 PM, Anthony Lander wrote:

> Hi Reinout,
>
> Much as I agree with your intuition, I believe you should roll back
> this change.
>
> The reason the 'old' result is correct is that '.*' is also greedy. In
> your example matching 'fooABCD' it is '.*' that is consuming as many
> characters as possible before moving on to the bracketed expression.
> The greediness (or not) of the alternation never comes into play.
>
The greediness as I implemented it at the time is not computed as a
local measure (maximum amount of characters matched by an alternation)
but as a global measure (which branch of the alternation advances the
matching process the furthest).

With that interpretation the greediness/eagerness of the alternation
does come into play.
(and then both are 'correct')


Anyway, so far we see one vote for rollback and one suggestion to add a
switch...

R
-
_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

John Brant-2
On 6/11/2014 10:12 AM, Reinout Heeck wrote:

> On 6/11/2014 4:07 PM, Anthony Lander wrote:
>> Hi Reinout,
>>
>> Much as I agree with your intuition, I believe you should roll back
>> this change.
>>
>> The reason the 'old' result is correct is that '.*' is also greedy. In
>> your example matching 'fooABCD' it is '.*' that is consuming as many
>> characters as possible before moving on to the bracketed expression.
>> The greediness (or not) of the alternation never comes into play.
>>
> The greediness as I implemented it at the time is not computed as a
> local measure (maximum amount of characters matched by an alternation)
> but as a global measure (which branch of the alternation advances the
> matching process the furthest).
>
> With that interpretation the greediness/eagerness of the alternation
> does come into play.
> (and then both are 'correct')
>
>
> Anyway, so far we see one vote for rollback and one suggestion to add a
> switch...

Whenever I deal with regexs, I'm reminded of the "Now, they have two
problems." quote. Anyway, I vote for the longest possible overall match.
It seems that sed with the extended syntax on my freebsd box uses that.
This command replaces "fooABCD" with "found" (instead of "foundD"):
         echo "fooABCD" | sed -E -e 's/.*(ABCD|BC)/found/g'

If you use the longest possible overall match, then you can rewrite the
regex easier. For example, one could rewrite your expression
".*(ABCD|BC)" as ".*ABCD|.*BC" (as one can rewrite x(y+z) as xy+xz).
However, if you use the ones on the regex101 site, the new regex matches
the whole string "fooABCD" whereas the original regex only matches
"fooABC". Furthermore, using the longest possible overall match you can
rewrite ".*ABCD|.*BC" as ".*BC|.*ABCD" and still match the same strings
(as you can rewrite x+y as y+x). However, if you do this on the regex101
site, you get a different match "fooABC" instead of "fooABCD".


John Brant
_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Steven Kelly
In reply to this post by Reinout Heeck-2

I’d vote for settling this in whatever way is most consistent with the behaviour of the regex library that is closest to Regex11. Overall, I’d like to be able to say “Regex11 is a subset of flavour X, but without features Y and Z”, where X is as well-known as possible.

 

Back in 2008, I went through all the implementations listed on regular-expressions.info then, and POSIX ERE was the closest:

Compared to POSIX ERE, Regex11 has (at least) the following missing (-)

and extra (+) features:

- limited repetitions

+ \d \w \s etc. shorthands

 

Based on that, I’d say the current code is correct.

 

I’d also like to stick to Vassili’s original intention. RxParser class>>e:implementationNotes: says it’s based on Henry Spencer’s original C implementation. That was used in POSIX and Tcl, both of which have greedy alternation (as does BSD, as John found out). Again, the current code seems the right answer.

 

Are these answers from the previous version (1.3.1) correct in some regex flavour (when required to match the whole string there)?

    '.*(ABCD|BC)' asRegex matches: 'fooABCD'          false

    '15' matchesRegex: '[1-9]|1[0-9]'                               false

Or did you fix a clear bug, and in doing so also change some (possibly mistakenly) non-ERE-flavour behaviour to ERE-flavour?

 

All the best,

Steve

 

From: [hidden email] [mailto:[hidden email]] On Behalf Of Reinout Heeck
Sent: Wednesday, June 11, 2014 1:15 PM
To: 'VWNC'
Subject: [vwnc] I introduced an incompatibility in regex11 (1.3.3)

 


Terry Raymond sent me a message that at first confused me:

I found a bug in regex11 and traced it back to your change;

Regex11 (1.3.1-soops1,reinz)  Development.

 

| matches testString |

testString := '15'.

matches := OrderedCollection new.

'([1-9]|1[0-9])' asRegex

                               matchesIn: testString

                               do:       [:each |

                                             matches add: each.].

matches

 

Your version results in  OrderedCollection ('15')

Previous version result   OrderedCollection ('1' '5')

 

Checking against  http://regex101.com/ I get global matches

1

5

 



It turns out that in regular language theory the 'alternatives' construct does not prefer left branch above right branch (=greedy), but that in most popular regex implementations it does prefer the first match (=eager).
I always thought that regex expressions as a whole are meant to be greedy and that is why I introduced this patch.

Looking a bit further I found this comparison page:
  http://www.regular-expressions.info/refbasic.html
The 'Alternation is greedy' entry is about this feature. It turns out that I am not alone in my expectations: POSIX ERE, Gnu BRE and Gnu ERE also use a greedy implementation while all other libraries listed there use the eager variant.

We now have a regex in the field, that is incompatible with the most popular regex libraries but that in my opinion creates more predictable results.
For example predict what part of the string will be matched by 'our' regex11 vs the regex101.com site in the following case:
  '.*(ABCD|BC)' asRegex matches: 'fooABCD'
(no cheating: first predict, then try :-)

I like this predictability so I would like to keep it in, but it may turn out to be a major PITA when porting regexen from other languages.

What is your opinion, should this fix be rolled back or should we keep it?


Reinout Heeck
--------------------
[hidden email]


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-2
On 6/11/2014 10:36 PM, Steven Kelly wrote:

Or did you fix a clear bug, and in doing so also change some (possibly mistakenly) non-ERE-flavour behaviour to ERE-flavour?

At the time I was very sure that all regex matchers were supposed to be greedy overall, only since yesterday do I understand that most variants have this eager alternation.

So yes, I clearly thought it a bug then and fixed it in the place I though best (the branching primitive of the matching machinery).
I might have altered the behavior of other regex operations, but looking at the code today it does not seem so at first blush.


R
-


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Jan Weerts
In reply to this post by Reinout Heeck-2
Hi all!

If I might vote: "longest overall match" as default with the option to switch :)

Regards
  Jan

On 11.06.2014 12:15, Reinout Heeck wrote:
> It turns out that in regular language theory the 'alternatives' construct does not prefer left branch above right branch (=greedy), but that in most popular regex implementations it does prefer the first match (=eager).
> I always thought that regex expressions as a whole are meant to be greedy and that is why I introduced this patch.
...
> What is your opinion, should this fix be rolled back or should we keep it?
_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-3
In reply to this post by Reinout Heeck-2
I published the package [Regex11 made popular] into the public repository.

This is the 'switch' that provides semantics more suitable to porting
regex expressions from other environments.
It is purely an extension and does not affect the operation of base Regex11.

I wont be developing this package actively, so if anyone here wants to
invest in it please take the lead :-)

Blessing comment:

> Initial sketch, it seems to work but is mostly untested!
>
> TODO:
> --documentation
> --tests
>
> This initial version implements eager semantics for RxmBranch:
>
> | matches |
> matches := OrderedCollection new.
> '([1-9]|1[0-9])' asPopularRegex matchesIn: '15
>     do: [:each | matches add: each].
> matches "-> OrderedCollection ('1' '5')"
>
> | matches  |
> matches := OrderedCollection new.
> '.*(ABCD|BC)' asPopularRegex matchesIn: 'fooABCD'
>     do: [:each | matches add: each].
> matches -> "OrderedCollection ('fooABC')"


Hope this helps,

Reinout
-------
_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-2
In reply to this post by Reinout Heeck-2
On 6/12/2014 10:11 AM, Reinout Heeck wrote:

> I might have altered the behavior of other regex operations, but
> looking at the code today it does not seem so at first blush.

I just published a compatibility package and found that I had to alter
more operations than I expected, so I have to take back the above: I
might well have inadvertently 'fixed' other parts of the regex11
semantics in 1.3.3....

R
-


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-2
In reply to this post by Reinout Heeck-2
(resent from proper list address)

I published the package [Regex11 made popular] into the public repository.

This is the 'switch' that provides semantics more suitable to porting
regex expressions from other environments.
It is purely an extension and does not affect the operation of base Regex11.

I wont be developing this package actively, so if anyone here wants to
invest in it please take the lead :-)

Blessing comment:

> Initial sketch, it seems to work but is mostly untested!
>
> TODO:
> --documentation
> --tests
>
> This initial version implements eager semantics for RxmBranch:
>
> | matches |
> matches := OrderedCollection new.
> '([1-9]|1[0-9])' asPopularRegex matchesIn: '15
>     do: [:each | matches add: each].
> matches "-> OrderedCollection ('1' '5')"
>
> | matches  |
> matches := OrderedCollection new.
> '.*(ABCD|BC)' asPopularRegex matchesIn: 'fooABCD'
>     do: [:each | matches add: each].
> matches -> "OrderedCollection ('fooABC')"


Hope this helps,

Reinout
-------
_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Terry Raymond
Not sure this does it.

When I compare against http://regex101.com I get conflicting differences.

regex101.com
expression ([1-9]|1[0-9])
test 15
global matches 1, 5

expression .*(ABCD|BC)
test fooABCD
global matches BC


regex11
expression ([1-9]|1[0-9])
test 15
global matches 15

expression .*(ABCD|BC)
test fooABCD
global matches fooABCD

regexPopular
expression ([1-9]|1[0-9])
test 15
global matches 1, 5

expression .*(ABCD|BC)
test fooABCD
global matches fooABCD


What is also interesting is that for regexPopular
  '.*(ABCD|BC)' asRegex matches: 'fooABCD'  
        true
  '.*(ABCD|BC)' asPopularRegex matches: 'fooABCD'  
        false

How is it that asPopuluarRegex matches is false but for global matches
it returns a match?

Terry

===========================================================
Terry Raymond
Crafted Smalltalk
80 Lazywood Ln.
Tiverton, RI  02878
(401) 624-4517      [hidden email]
===========================================================

> -----Original Message-----
> From: [hidden email] [mailto:[hidden email]] On
> Behalf Of Reinout Heeck
> Sent: Thursday, June 12, 2014 6:26 AM
> To: [hidden email]
> Subject: Re: [vwnc] I introduced an incompatibility in regex11 (1.3.3)
>
> (resent from proper list address)
>
> I published the package [Regex11 made popular] into the public repository.
>
> This is the 'switch' that provides semantics more suitable to porting
regex
> expressions from other environments.
> It is purely an extension and does not affect the operation of base
Regex11.
>
> I wont be developing this package actively, so if anyone here wants to
invest

> in it please take the lead :-)
>
> Blessing comment:
>
> > Initial sketch, it seems to work but is mostly untested!
> >
> > TODO:
> > --documentation
> > --tests
> >
> > This initial version implements eager semantics for RxmBranch:
> >
> > | matches |
> > matches := OrderedCollection new.
> > '([1-9]|1[0-9])' asPopularRegex matchesIn: '15
> >     do: [:each | matches add: each].
> > matches "-> OrderedCollection ('1' '5')"
> >
> > | matches  |
> > matches := OrderedCollection new.
> > '.*(ABCD|BC)' asPopularRegex matchesIn: 'fooABCD'
> >     do: [:each | matches add: each].
> > matches -> "OrderedCollection ('fooABC')"
>
>
> Hope this helps,
>
> Reinout
> -------
> _______________________________________________
> vwnc mailing list
> [hidden email]
> http://lists.cs.uiuc.edu/mailman/listinfo/vwnc



_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-2
Terry,
   you seem to be misreporting, here is what I see:

> (1) =============
> regex101.com
> expression:    /([1-9]|1[0-9])/g
> test: 15
> globally matches:    '15'
> match groups: '1','5'
>
> '([1-9]|1[0-9])' asPopularRegex matchesIn: '15' "--> OrderedCollection
> ('1' '5')"
> |rs matchedGroups|
> rs := '15' readStream. matchedGroups := OrderedCollection new.
> [rs atEnd] whileFalse:[
>     matchedGroups add: ('([1-9]|1[0-9])' asPopularRegex searchStream:
> rs; subexpressions: 2)].
> matchedGroups "--> OrderedCollection (#('1') #('5'))"
> --> this seems consistent
>
> (2) =============
> regex101.com
> expression    /([1-9]|1[0-9])/
> test 15
> globally matches:    '1'
> match groups: '1'
>
> ('([1-9]|1[0-9])' asPopularRegex matchesIn: '15') first "--> '1' "
> '([1-9]|1[0-9])' asPopularRegex search: '15'; subexpressions: 2 "-->
> #('1') "
> --> this seems consistent
>
> (3) =============
> regex101.com
> expression:    /.*(ABCD|BC)/g
> test: fooABCD
> globally matches:    'fooABC'
> match groups: 'BC'
>
> '.*(ABCD|BC)' asPopularRegex matchesIn: 'fooABCD' "-->
> OrderedCollection ('fooABC')"
> |rs matchedGroups|
> rs := 'fooABCD' readStream. matchedGroups := OrderedCollection new.
> [rs atEnd] whileFalse:[
>     matchedGroups add: ('.*(ABCD|BC)' asPopularRegex searchStream: rs;
> subexpressions: 2)].
> matchedGroups "--> OrderedCollection (#('BC') #()) "
> --> this seems consistent
>
> (4) =============
> regex101.com
> expression    /.*(ABCD|BC)/
> test fooABCD
> globally matches:    'fooABC'
> match groups: 'BC'
>
> ('.*(ABCD|BC)' asPopularRegex matchesIn: 'fooABCD') first "--> 'fooABC' "
> '.*(ABCD|BC)' asPopularRegex search: 'fooABCD'; subexpressions: 2 "-->
> #('BC') "
> --> this seems consistent



On 6/12/2014 3:25 PM, Terry Raymond wrote:

> [...]
>
>
> What is also interesting is that for regexPopular
>    '.*(ABCD|BC)' asRegex matches: 'fooABCD'
> true
>    '.*(ABCD|BC)' asPopularRegex matches: 'fooABCD'
> false
>
> How is it that asPopuluarRegex matches is false but for global matches
> it returns a match?

Because #matches: has anchored semantics (implied '^' and '$'
sentinels), see the implementation of #matchesStream:.
Since in above case regular regex11 can match _all_ of the string it
succeeds, the popular variant does not match _all_ of the string.



I won't be responding to emails on this address until Monday,  don't be
alarmed :-)


R
-

_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-2
Hi all,
  it seems that the [Regex11 made popular] package has issues, the
following fragment of private communication illustrates an internal
dependence on eager evaluation.
I'm not sure where to go from here...


On 6/12/2014 8:26 PM, Terry Raymond wrote:
> regex11 popular  " no matches "
>      '.*(ABCD|BC)' asPopularRegex matches: 'fooABCD'
>         false
> However
>      '.*(ABCD|BC)' asPopularRegex matchesIn: 'fooABCD'
>         OrderedCollection ('fooABC')
>
>

Hi Terry,

I had a quick look into this, it comes down to the implementation of
RxMatcher>>matchesStream:
     ^(self matchesStreamPrefix: theStream)
         and: [stream atEnd]


In this particular case the regex can match the stream prefix without
backtracking (matches 'fooABC'), so the atEnd test will return false.

If we force backtracking by altering the regex as follows:

    '^.*(ABCD|BC)$' asPopularRegex matches: 'fooABCD'

we can see it work again.

So it seems that #matchesStream: needs a specialized implementation on
RxPopularMatcher, I'm just not sure how to implement this in a nice way.
_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: I introduced an incompatibility in regex11 (1.3.3)

Reinout Heeck-2
On 6/16/2014 11:00 AM, Reinout Heeck wrote:
> Hi all,
>  it seems that the [Regex11 made popular] package has issues, the
> following fragment of private communication illustrates an internal
> dependence on eager evaluation.
>

I meant 'greedy' of course....
_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc