1
1
2
- let std-apply-macro(tctx: Maybe<TContext>, t: AST): (TContext?, AST) = (
2
+ let std-apply-macro(tctx: Maybe<TContext>, t: AST, used: IsUsed ): (TContext?, AST) = (
3
3
match t {
4
4
App{left:Var{mname=key}, margs=right} => (
5
- std-apply-macro(tctx, mname, margs);
5
+ std-apply-macro(tctx, mname, margs, used );
6
6
);
7
7
}
8
8
);
9
9
10
- let std-apply-macro(tctx: Maybe<TContext>, mname: CString, margs: AST): (TContext?, AST) = std-apply-macro(tctx, mname, margs, true);
11
- let std-apply-macro-weak(tctx: Maybe<TContext>, mname: CString, margs: AST): (TContext?, AST) = std-apply-macro(tctx, mname, margs, false);
10
+ let std-apply-macro(tctx: Maybe<TContext>, mname: CString, margs: AST, used: IsUsed ): (TContext?, AST) = std-apply-macro(tctx, mname, margs, used , true);
11
+ let std-apply-macro-weak(tctx: Maybe<TContext>, mname: CString, margs: AST, used: IsUsed ): (TContext?, AST) = std-apply-macro(tctx, mname, margs, used , false);
12
12
13
13
let std-apply-macro-concat(tctx: Maybe<TContext>, mname: CString, margs: AST): (TContext?, AST) = (
14
14
match margs {
@@ -17,14 +17,22 @@ let std-apply-macro-concat(tctx: Maybe<TContext>, mname: CString, margs: AST): (
17
17
}
18
18
);
19
19
20
+ let std-apply-macro-variable(tctx: Maybe<TContext>, mname: CString, margs: AST): (TContext?, AST) = (
21
+ match margs {
22
+ Var{} => (tctx, margs);
23
+ _ => (tctx, ASTEOF);
24
+ }
25
+ );
26
+
20
27
let std-apply-macro-location(tctx: Maybe<TContext>, mname: CString, margs: AST): (TContext?, AST) = (
21
28
(tctx, mk-lit(to-smart-string(margs.location)).ascript(t1(c"SmartString")))
22
29
);
23
30
24
- let std-apply-macro(tctx: Maybe<TContext>, mname: CString, margs: AST, strong: Bool): (TContext?, AST) = (
31
+ let std-apply-macro(tctx: Maybe<TContext>, mname: CString, margs: AST, used: IsUsed, strong: Bool): (TContext?, AST) = (
25
32
let result = ASTEOF;
26
33
if mname==c"macro::concat" then (tctx, result) = std-apply-macro-concat(tctx, mname, margs)
27
34
else if mname==c"macro::location" then (tctx, result) = std-apply-macro-location(tctx, mname, margs)
35
+ else if mname==c"macro::variable" then (tctx, result) = std-apply-macro-variable(tctx, mname, margs)
28
36
else {
29
37
let row = index-macro-table.lookup(mname, [] :: List<(Type,Type,AST)>);
30
38
let peep-holes = TAny;
@@ -63,7 +71,7 @@ let std-apply-macro(tctx: Maybe<TContext>, mname: CString, margs: AST, strong: B
63
71
(tctx, result) = std-apply-macro-candidates(tctx, mname, margs, candidates);
64
72
};
65
73
if strong && not(non-zero(result)) then exit-error("Failed to Apply Macro: \{mname}\nArgs: \{margs}\n", margs);
66
- if strong then (tctx, result) = std-infer-expr(tctx, result, false, Used , TAny);
74
+ if strong then (tctx, result) = std-infer-expr(tctx, result, false, used , TAny);
67
75
(tctx, result)
68
76
);
69
77
0 commit comments