<div dir="ltr">Duh!<div><br></div><div>while ( my $ii = $i->iterate ) {}</div><div><br></div><div>is judged on $ii, and if $ii == 0, it is based on the value of $ii , not of defined $ii.<br><br>So while (1) {</div><div>   my $ii = $i->iterate;</div><div>  ...</div><div>}</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Aug 21, 2018 at 11:57 AM Dave Jacoby <<a href="mailto:jacoby.david@gmail.com">jacoby.david@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I won't start in on why I started looking at attributes (blame Matt S. Trout), but <br>in looking at them, PerlTricks has a post showing how you can assign to a function like a variable by setting lvalue.<br><br>I played with it some to get this:<br><div style="color:rgb(0,0,0);font-family:"Fira Code","Droid Sans Mono Slashed",monospace;font-size:12px;line-height:16px;white-space:pre-wrap"><div>    <span style="color:rgb(175,0,219)">package</span> <span style="color:rgb(38,127,153)">Foo</span>;</div><div>    <span style="color:rgb(175,0,219)">use</span> Scalar::Util <span style="color:rgb(163,21,21)">qw(looks_like_number)</span>;</div><div>    <span style="color:rgb(0,0,255)">sub</span> <span style="color:rgb(121,94,38)">new</span> { <span style="color:rgb(121,94,38)">bless</span> {}, <span style="color:rgb(121,94,38)">shift</span> }</div><div>    <span style="color:rgb(0,0,255)">sub</span> <span style="color:rgb(121,94,38)">iterate</span> : lvalue {</div><div>        <span style="color:rgb(0,0,255)">my</span> <span style="color:rgb(0,16,128)">$self</span> = <span style="color:rgb(121,94,38)">shift</span>;</div><div>        <span style="color:rgb(0,16,128)">$self</span>->{iterate} = 0<br></div><div>            <span style="color:rgb(175,0,219)">if</span> !<span style="color:rgb(121,94,38)">defined</span> <span style="color:rgb(0,16,128)">$self</span>->{iterate}</div><div>            || !looks_like_number( <span style="color:rgb(0,16,128)">$self</span>->{iterate} );</div><div>            <span style="color:rgb(0,16,128)">$self</span>->{iterate} ++ ;<br></div><div>        <span style="color:rgb(0,16,128)">$self</span>->{iterate};<br></div><div>    }</div><br></div>This allows this:<div><br></div><div><div style="color:rgb(0,0,0);font-family:"Fira Code","Droid Sans Mono Slashed",monospace;font-size:12px;line-height:16px;white-space:pre-wrap"><div>    <span style="color:rgb(0,0,255)">my</span> <span style="color:rgb(0,16,128)">$i</span> = Foo->new();</div><div>    <span style="color:rgb(0,16,128)">$i</span>->iterate = 11;</div><div>    <span style="color:rgb(175,0,219)">while</span> ( <span style="color:rgb(0,0,255)">my</span> <span style="color:rgb(0,16,128)">$ii</span> = <span style="color:rgb(0,16,128)">$i</span>->iterate ) {</div><div>        <span style="color:rgb(121,94,38)">say</span> <span style="color:rgb(163,21,21)">qq{</span><span style="color:rgb(255,0,0)">\t</span><span style="color:rgb(0,16,128)">$ii</span><span style="color:rgb(163,21,21)">}</span> ;</div><div>        <span style="color:rgb(175,0,219)">last</span> <span style="color:rgb(175,0,219)">if</span> <span style="color:rgb(0,16,128)">$ii</span> >= 20;</div><div>    }</div></div><div><br></div>Which gives us this:<br><br><div><span style="white-space:pre-wrap">       </span>12</div><div><span style="white-space:pre-wrap">       </span>13</div><div><span style="white-space:pre-wrap">       </span>14</div><div><span style="white-space:pre-wrap">       </span>15</div><div><span style="white-space:pre-wrap">       </span>16</div><div><span style="white-space:pre-wrap">       </span>17</div><div><span style="white-space:pre-wrap">       </span>18</div><div><span style="white-space:pre-wrap">       </span>19</div><div><span style="white-space:pre-wrap">       </span>20</div><div><br></div><div>To reiterate, you would expect $i->iterate(11), not $i->iterate = 11 . <br><br>This is a small change, and I might not ever use this in real life -- esp., if mst said (I think) that there's a problem with signature and attribute order recently, meaning I couldn't write sub function ( $x ) { code } anymore.</div><div><br></div><div>But...<br><br><div style="color:rgb(0,0,0);font-family:"Fira Code","Droid Sans Mono Slashed",monospace;font-size:12px;line-height:16px;white-space:pre-wrap"><div>    <span style="color:rgb(0,0,255)">my</span> <span style="color:rgb(0,16,128)">$i</span> = Foo->new();</div><div>    <span style="color:rgb(0,16,128)">$i</span>->iterate = -4;</div><div>    <span style="color:rgb(175,0,219)">while</span> ( <span style="color:rgb(0,0,255)">my</span> <span style="color:rgb(0,16,128)">$ii</span> = <span style="color:rgb(0,16,128)">$i</span>->iterate ) {</div><div>        <span style="color:rgb(121,94,38)">say</span> <span style="color:rgb(163,21,21)">qq{</span><span style="color:rgb(255,0,0)">\t</span><span style="color:rgb(0,16,128)">$ii</span><span style="color:rgb(163,21,21)">}</span> ;</div><div>        <span style="color:rgb(175,0,219)">last</span> <span style="color:rgb(175,0,219)">if</span> <span style="color:rgb(0,16,128)">$ii</span> >= 20;</div><div>    }</div></div></div><div style="color:rgb(0,0,0);font-family:"Fira Code","Droid Sans Mono Slashed",monospace;font-size:12px;line-height:16px;white-space:pre-wrap"><br></div><div style="color:rgb(0,0,0);font-family:"Fira Code","Droid Sans Mono Slashed",monospace;font-size:12px;line-height:16px;white-space:pre-wrap"><span style="font-family:Arial,Helvetica,sans-serif;font-size:small;color:rgb(34,34,34)">gives use</span><br></div><div><br></div><div><div><span style="white-space:pre-wrap">   </span>-3</div><div><span style="white-space:pre-wrap">       </span>-2</div><div><span style="white-space:pre-wrap">       </span>-1</div></div><div><br></div><div>Something in Foo::iterate stops at 0. Zero should be defined. Zero should look like a number.<br><br>Can anyone see the "stop iterating at zero" bug in my "toy code; don't use in production" iterator?</div>-- <br><div dir="ltr" class="m_6509811433348344133gmail_signature"><div dir="ltr"><div>Dave Jacoby<br>
<a href="mailto:jacoby.david@gmail.com" target="_blank">jacoby.david@gmail.com</a><br>
<br>Don't panic when the crisis is happening, or you won't enjoy it.</div></div></div></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Dave Jacoby<br>
<a href="mailto:jacoby.david@gmail.com" target="_blank">jacoby.david@gmail.com</a><br>
<br>Don't panic when the crisis is happening, or you won't enjoy it.</div></div></div>