function sortedKeys(inTable)
  local keyList = {}
  local index = 1
  for k,_ in pairs(inTable) do
    table.insert(keyList,k)
  end
  -- Allow numbers and strings;
  -- strings before numbers 
  local sf = function(a,b)
    if(type(a) == 'number' 
       and 
       type(b) == 'string') 
    then
      return false
    elseif (type(b) == 'number'
            and 
           type(a) == 'string')
    then
      return true
    end
    return a < b
  end
  table.sort(keyList, sf)
  return function()
    rvalue = keyList[index]
    index = index + 1
    return rvalue
  end
end
To run:
a = {hi="there"}
a[1] = "one"
a["one"] = "1string"
a["999"] = "three9s"
a[2] = "two"
for k in sortedKeys(a) do
  print(k,a[k])
end
This will output the following:
999     three9s
hi      there
one     1string
1       one
2       two
Strings are lexically sorted and numbers are numerically sorted. All strings come before all numbers. Unlike Javascript objects, in Lua, the number 1 and the string "1" can both be in the same table and are separate table keys.
Comments for blog entries can be seen in the forum.