]> git.lizzy.rs Git - metalua.git/blob - src/lib/metalua/dollar.mlua
Merge remote branch 'origin/master'
[metalua.git] / src / lib / metalua / dollar.mlua
1 -- TODO: support modules as macros?
2 --       does it make sense to store a constant AST as a macro?
3
4 -{ extension 'match' }
5
6 dollar = rawget(getfenv(), 'dollar') or { }
7
8 local function dollar_builder(call)
9    match call with
10    | `Call{ `Id{name}, ... } -> return dollar[name](select(2, unpack(call)))
11    | `Id{name} -> 
12       local m = dollar[name]
13       match type(m) with
14       | 'function' -> return m()
15       | 'table'    -> return m
16       | 'nil'      -> error "No such macro registered"
17       | t          -> error ("Invalid macro type "..t)
18       end
19    | _ -> error "Invalid $macro, '$' should be followed by an identifier or function call"
20    end
21 end   
22
23 mlp.expr.prefix:add{ '$', prec = 100, builder = |_, x| dollar_builder(x) }
24 mlp.stat:add{ '$', mlp.expr, builder = |x| dollar_builder(x[1]) }