aboutsummaryrefslogtreecommitdiff
path: root/metafang/cm.lua
blob: e2d11f60d549d17389403dd6f68355d9e4c25b2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-- Cm: name inspired by "C meta(language)", but it's not really a metalangauge (whatever this means) of C (or anything else)

local function LateResolveType(name)
    -- "lb" - Lazy Binding
    return {_tag = "lb", _lb_typename = name}
end

local function TypeTagger(tag)
    return function(props)
        props._tag = tag
        return props
    end
end

local cm_env_fns = {
    _namespace = 0, -- TODO
    _t = LateResolveType,
    _struct = TypeTagger("struct"),
    _union = TypeTagger("union"),
    _alias = TypeTagger("alias"),
}
local cm_env_metatable = {__index = cm_env_fns}

---@param fn function
---@return table
function LoadCmLua(fn)
    local env = {}
    setmetatable(env, cm_env_metatable)

    local old_fenv = getfenv(fn)
    setfenv(fn, env)
    pcall(fn)
    setfenv(fn, old_fenv)

    return env  
end

function LoadCmDecl(src)
    -- TODO
end