function showTable(tbl)
	if type(tbl)=='table' then
		local result = {}
		for _, val in pairs(tbl) do
			table.insert(result, showTable(val))
		end
		return '{' .. table.concat(result, ', ') .. '}'
	else
		return (tostring(tbl))
	end
end

function sortTable(op)
	local tbl = op.table or {}
	local column = op.column or 1
	local reverse = op.reverse or false
	local cmp = op.cmp or (function (a, b) return a < b end)
	local compareTables = function (a, b)
		local result = cmp(a[column], b[column])
		if reverse then return not result else return result end
	end
	table.sort(tbl, compareTables)
end

A = {{"quail", "deer", "snake"},
	{"dalmation", "bear", "fox"},
	{"ant", "cougar", "coyote"}}
print('original', showTable(A))

sortTable{table=A}
print('defaults', showTable(A))

sortTable{table=A, column=2}
print('col 2    ', showTable(A))

sortTable{table=A, column=3}
print('col 3    ', showTable(A))

sortTable{table=A, column=3, reverse=true}
print('col 3 rev', showTable(A))

sortTable{table=A, cmp=(function (a, b) return #a < #b end)}
print('by length', showTable(A))