40 lines
1.1 KiB
Plaintext
Executable File

require 'metalua.dollar'
-{ extension 'match' }
function dollar.log(...)
local args = {...}
local ti = table.insert
local code = { }
local nohash = false
local width = 80
local i=1
if args[i].tag=='String' then
ti(code, +{print(" [LOG] "..-{args[1]})})
i += 1
end
local xtra_args, names, vals = { }, { }, { }
for i=i, #args do
match args[i] with
| +{ 'nohash' } -> nohash = true
| `Number{ w } -> width = w
--| `String{...} | `Number{...} -> ti (xtra_args, args[i])
| `Id{n} -> ti (names, n); ti (vals, args[i])
| x -> ti (names, table.tostring(x, 'nohash')); ti (vals, x)
end
end
for i=1, #names do
local msg = string.format(" [LOG] %s = ", names[i])
local printer = `Call{ +{table.tostring},
vals[i],
`Number{ width },
`Number{ #msg } }
if nohash then ti(printer, +{'nohash'}) end
ti (code, `Call{ +{printf}, +{"%s%s"}, `String{ msg }, printer })
end
return code
end