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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
%%
%% File: syntax_tools_test.erl
%% Author: Björn-Egil Dahlberg
%% Created: 2014-10-23
%%
-module(syntax_tools_test).
-export([foo1/0,foo2/2,foo3/0,foo4/3,foo5/1]).
-include_lib("kernel/include/file.hrl").
-record(state, { a, b, c, d}).
-attribute([foo/0]).
-define(attrib, some_attrib).
-?attrib([foo2/2]).
-define(macro_simple1, ok).
-define(MACRO_SIMPLE2, (other)).
-define(macro_simple3, ?MODULE).
-define(macro_simple4, [?macro_simple3,?MODULE,?MACRO_SIMPLE2]).
-define(macro_simple5, (process_info)).
-define(macro_string, "hello world").
-define(macro_argument1(X), (X + 3)).
-define(macro_argument2(X,Y), (X + 3 * Y)).
-define(macro_block(X), begin X end).
-define(macro_if(X1,X2), if X1 -> X2; true -> none end).
-ifdef(macro_def1).
-define(macro_cond1, yep).
-else.
-define(macro_cond1, nope).
-endif.
-ifndef(macro_def2).
-define(macro_cond2, nope).
-else.
-define(macro_cond2, yep).
-endif.
-undef(macro_def1).
-undef(macro_def2).
%% basic test
foo1() ->
ok.
%% macro test
foo2(A,B) ->
% string combining ?
[?macro_string, ?macro_string
?macro_string,
"hello world "
"more hello",
[?macro_simple1,
?MACRO_SIMPLE2,
?macro_simple3,
?macro_simple4,
?macro_simple5,
?macro_string,
?macro_cond1,
?macro_cond2,
?macro_block(A),
?macro_if(A,B),
?macro_argument1(A),
?macro_argument1(begin A end),
?macro_block(<<"hello">>),
?macro_block("hello"),
?macro_block([$h,$e,$l,$l,$0]),
?macro_argument1(id(<<"hello">>)),
?macro_argument1(if A -> B; true -> 3.14 end),
?macro_argument1(case A of ok -> B; C -> C end),
?macro_argument1(receive M -> M after 100 -> 3 end),
?macro_argument1(try foo5(A) catch C:?macro_simple5 -> {C,B} end),
?macro_argument2(A,B)],
A,B,ok].
id(I) -> I.
%% basic terms
foo3() ->
[atom,
'some other atom',
{tuple,1,2,3},
1,2,3,3333,
3,3333,2,1,
[$a,$b,$c],
"hello world",
<<"hello world">>,
<<1,2,3,4,5:6>>,
3.1415,
1.03e33].
%% application and records
foo4(A,B,#state{c = C}=S) ->
Ls = foo3(),
S1 = #state{ a = 1, b = 2 },
[foo2(A,Ls),B,C,
B(3,C),
erlang:process_info(self()),
erlang:?macro_simple5(self()),
A:?MACRO_SIMPLE2(),
A:?macro_simple1(),
A:process_info(self()),
A:B(3),
S#state{ a = 2, b = B, d = S1 }].
foo5(A) ->
try foo2(A,A) of
R -> R
catch
error:?macro_simple5 ->
nope
end.
|