-- table
--[[
ta attributes of the table tag
ra attributes of the tr tag
da attributes of the td tag

    x { row_1, ... , row_n }

An error if the rows are not all the same size.
--]]
local push = \ (x, a) x[1 + #x] = a end
local TABLE = \ (x, ta, ra, da)
    local t = TAG.table (ta or "")
    local r = TAG.tr (ra or "")
    local d = TAG.td (da or "")
    local o = { push = push }
    assert (#x > 0)
    local size = #x[1]
    for i = 1, #x do
      o_r = { push = push }
      local row = x[i]
      assert (#row == size)
      for j = 1, size do
         o_r:push (d (row[j]))
      end -- for
      o:push (r (o_r))
   end -- for
   => t (o)
   end
=> { TABLE = TABLE }