forked from Raku/roast
-
Notifications
You must be signed in to change notification settings - Fork 0
/
quasi-blocks.t
136 lines (108 loc) · 2.69 KB
/
quasi-blocks.t
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
use v6;
use Test;
use experimental :macros;
plan 14;
# Just to avoid tedium, the macros in this file are
# named after Santa's reindeers.
{ # macro called like a sub
my $macro_visits;
macro dasher() {
$macro_visits++;
quasi {}
}
dasher();
is $macro_visits, 2, "calls to macro are at parse time";
dasher();
my $total_args;
macro dancer($a, $b?) {
$total_args++ if defined $a;
$total_args++ if defined $b;
quasi {}
}
dancer(17);
is $total_args, 3, "macro call with arguments works";
dancer(15, 10);
}
{ # macro called like a list prefix
my $macro_visits;
macro prancer() {
$macro_visits++;
quasi {}
}
prancer;
is $macro_visits, 2, "macro calls without parens work";
prancer;
my $total_args;
macro vixen($a, $b?) {
$total_args++ if defined $a;
$total_args++ if defined $b;
quasi {}
}
vixen 17;
is $total_args, 3, "macro call with arguments works";
vixen 15, 10;
}
# macro defined as an operator, and used as one
{
macro infix:<comet>($rhs, $lhs) { #OK not used
quasi { "comet!" }
}
my $result = 1 comet 2;
is $result, "comet!", "can define an entirely new operator";
}
{
macro infix:<+>($rhs, $lhs) {
quasi { "chickpeas" }
}
my $result = "grasshopper" + "motor oil";
is $result, "chickpeas", "can shadow an existing operator";
}
{
macro cupid {
my $a = "I'm cupid!";
quasi { $a }
}
my $result = cupid;
is $result, "I'm cupid!", "lexical lookup from quasi to macro works";
}
#?rakudo skip "Cannot resolve caller prefix:<++>(Mu) RT #124968"
{
my $counter = 0;
macro donner {
quasi { ++$counter }
}
is donner, 1, "lexical lookup from quasi to outside macro works";
is donner, 2, "...twice";
}
{
macro blitzen($param) {
quasi { $param }
}
ok blitzen("onwards") ~~ AST,
"lexical lookup from quasi to macro params works";
}
{
macro id($param) { $param };
is id('x'), 'x', 'macro can return its param';
}
{
macro funny_nil { quasi { {;}() } }
is funny_nil(), Nil, 'Nil from an empty block turns into no code';
}
# RT #115500
{
macro rt115500v1() {
my $q1 = quasi { 6 };
my $q2 = quasi { 6 * 10 };
quasi { {{{$q1}}} + {{{$q2}}} }
};
is rt115500v1(), 66,
'addition of two quasis with arithmetical expressions works (1)';
macro rt115500v2() {
my $q1 = quasi { 5 + 1 };
my $q2 = quasi { 6 * 10 };
quasi { {{{$q1}}} + {{{$q2}}} }
};
is rt115500v2(), 66,
'addition of two quasis with arithmetical expressions works (2)';
}