lua-users home
lua-l archive

[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)