On Tue, 28 Feb 2017 05:54:51 -0800, timo wrote:
> I'd say this is NOTABUG via the DIHWIDT category. If your where clause
> has side-effects, you're bound to get in trouble.
>
> If you're fine with relying on internals, you can just put True into the
> one-out-of-ten three times at the end and the program will run through
> to 100.
>
>
> test 90
> 90
> 91
> 92
> 93
> 94
> 95
> 96
> 97
> 98
> 99
> test 100
> 100
> timo@schmand ~> cat /tmp/inconsistent.p6
> my \one-out-of-ten =
> (|(False,False,False,False,False,False,False,False,False,True,True,True)
> xx *).iterator;
>
> multi sub rarely ( $_ where one-out-of-ten.pull-one ){ say "test
> $_"; nextsame}
> multi sub rarely ( $_ ) { .say }
>
> (1..100).map: &rarely;
>
> We rely on binding a signature to give the same result multiple times in
> a row to make signature binding code a whole bunch faster. We have a
> "slow binder" and a "fast binder". The fast one can only produce a "it
> worked" or "it didn't work" result, so after a "it didn't work" result
> was encountered we run the slow one over the same values to produce an
> actual error message. Normally if your where clauses behave in an impure
> manner, you'd get "Internal error: inconsistent bind result" (that's
> when the fast binder says "failed" and the slow binder can't reproduce
> the failure).
>
> I'm not entirely sure why it gives you "Constraint type check failed for
> parameter '$_'". My best guess is that because it first tries to figure
> out which candidate to invoke and then actually calls into the candidate
> (which starts with code generated by the fast binder) it hits a bind
> failure as if you had directly invoked that candidate yourself but with
> non-matching arguments.
>
> Zoffix wrote a bit of code on IRC that demonstrates "inconsistent bind
> result", btw:
>
> perl6 -e 'my $val; multi foo($ where {$val++ %% 2 ?? 1 !! 0}) { say
> "here" }; multi foo($) { say "♥" }; foo(42) for ^20'
> Internal error: inconsistent bind result
> in sub foo at <tmp> line 1
> in block <unit> at <tmp> line 1
>
> Hope that clears things up!
> - Timo
>
> BTW, for a fun time, put a "say 'here'" into a where clause and count
> how often it gets invoked.
>
Closing this per comments above.
I've committed a note into the docs to clarify side-effects from where clauses
aren't meant to work:
https://github.com/perl6/doc/commit/3ed1803f11a3bf06de2400db5b7f9159c54dddb8