25 lines
806 B
Plaintext
Executable File
25 lines
806 B
Plaintext
Executable File
-- TODO: support modules as macros?
|
|
-- does it make sense to store a constant AST as a macro?
|
|
|
|
-{ extension 'match' }
|
|
|
|
dollar = rawget(getfenv(), 'dollar') or { }
|
|
|
|
local function dollar_builder(call)
|
|
match call with
|
|
| `Call{ `Id{name}, ... } -> return dollar[name](select(2, unpack(call)))
|
|
| `Id{name} ->
|
|
local m = dollar[name]
|
|
match type(m) with
|
|
| 'function' -> return m()
|
|
| 'table' -> return m
|
|
| 'nil' -> error "No such macro registered"
|
|
| t -> error ("Invalid macro type "..t)
|
|
end
|
|
| _ -> error "Invalid $macro, '$' should be followed by an identifier or function call"
|
|
end
|
|
end
|
|
|
|
mlp.expr.prefix:add{ '$', prec = 100, builder = |_, x| dollar_builder(x) }
|
|
mlp.stat:add{ '$', mlp.expr, builder = |x| dollar_builder(x[1]) }
|