aboutsummaryrefslogtreecommitdiff
path: root/lib/scopes.nom
blob: 8555287fb7ff270373afa1bc0a0d545d966efd50 (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
require "lib/metaprogramming.nom"
require "lib/operators.nom"
require "lib/control_flow.nom"

compile [<%var> = %value] to code: ".."
    nomsu.defs['#vars'][\(repr (%var's "value"))] = \(%value as lua);

compile [<%var>] to: "nomsu.defs['#vars'][\(repr (%var's "value"))]"

compile [str %] to: "tostring(\(% as lua))"

compile [scope] to: "nomsu.defs"
compile [parent scope] to: "getmetatable(nomsu.defs).__index"

parse [using %scoped do %actions] as:
    %scope = (=lua "setmetatable({['#vars']=setmetatable({}, {__index=nomsu.defs['#vars']})}, {__index=nomsu.defs})")
    with (nomsu's "defs") = %scope:
        do %scoped
        lua> ".."
            getmetatable(nomsu.defs).__newindex = getmetatable(nomsu.defs).__index;
            getmetatable(nomsu.defs["#vars"]).__newindex = getmetatable(nomsu.defs["#vars"]).__index;
        do %actions

parse [scoped %actions] as: using %actions do {pass}

rule [from %filename import %rules] =:
    using:
        require %filename
    ..do:
        %srcs = ((%'s "src") for %_ = % in (parent scope))
        for %src in (unique %srcs):
            run %src

parse [wrap %signature with %body] as:
    using:
        run ((nomsu)->*["defs",nomsu "get_stub" [\%signature->*["value",1]],"src"])
    ..do:
        rule %signature = %body