-
Notifications
You must be signed in to change notification settings - Fork 135
/
quasi-blocks.t
120 lines (93 loc) · 2.24 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
use v6;
use Test;
plan 12;
# 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";
}
#?pugs skip 'undeclared variable'
{
macro cupid {
my $a = "I'm cupid!";
quasi { $a }
}
my $result = cupid;
is $result, "I'm cupid!", "lexical lookup from quasi to macro works";
}
{
my $counter = 0;
macro donner {
quasi { ++$counter }
}
is donner, 1, "lexical lookup from quasi to outside macro works";
is donner, 2, "...twice";
}
#?pugs skip 'undeclared variable'
{
macro blitzen($param) {
quasi { $param }
}
ok blitzen("onwards") ~~ AST,
"lexical lookup from quasi to macro params works";
}
#?pugs skip 'No such subroutine: "&x"'
{
macro id($param) { $param };
is id('x'), 'x', 'macro can return its param';
}
#?pugs skip 'Nil'
{
macro funny_nil { quasi { {;}() } }
is funny_nil(), Nil, 'Nil from an empty block turns into no code';
}