lua-users home
lua-l archive

Re: What's the rationale behind "for i=a,b[,c]"?

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


It was thus said that the Great Choonster TheMage once stated:
> On 17 March 2015 at 21:45, Soni L. <fakedme@gmail.com> wrote:
> >
> > local a,b,c = 1,10,nil
> > for i=a,b,c do print(i) end -- doesn't work because of the explicit nil :/
> > why's nil not a valid "no value" here? :/
> >
> > So there's no easy way to do it, other than:
> >
> > local a,b,c = 1,10,nil
> > if c == nil then
> > for i=a,b do
> > <mycode>
> > end
> > else
> > for i=a,b,c do
> > <mycode> -- we have to duplicate the code?!
> > end
> > end
> >
> > Which's bad due to duplicated code
> >
> >
> > --
> > Disclaimer: these emails are public and can be accessed from <TODO: get a
> > non-DHCP IP and put it here>. If you do not agree with this, DO NOT REPLY.
> >
> >
> 
> What about this?
> 
> local a,b,c = 1,10,nil
> for i = a, b, c or 1 do
> <mycode>
> end
Or ...
function range(low,high,delta)
 local up = function(v) return v <= high end
 local down = function(v) return v >= high end
 local d
 local cmp
 if not delta then
 if low < high then
 d = 1
 else
 d = -1
 end
 else
 d = delta
 end
 if d > 0 then
 cmp = up
 else
 cmp = down
 end
 return function(s,v)
 v = v + d
 if cmp(v) then
 return v
 end
 end,nil,low-d
end
for x in range(string.byte("AZ",1,2)) do
 print(x)
end
for x in range(1,10,1) do print(x) end
for x in range(10,1,-1) do print(x) end
for x in range(string.byte("ZA",1,2),-1) do
 print(x)
end
 -spc (And just skip the whole "for i = low,high ..." thing entirely)

AltStyle によって変換されたページ (->オリジナル) /