line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# You may distribute under the terms of either the GNU General Public License |
2
|
|
|
|
|
|
|
# or the Artistic License (the same terms as Perl itself) |
3
|
|
|
|
|
|
|
# |
4
|
|
|
|
|
|
|
# (C) Paul Evans, 2023 -- leonerd@leonerd.org.uk |
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
package Sublike::Extended 0.20; |
7
|
|
|
|
|
|
|
|
8
|
1
|
|
|
1
|
|
250326
|
use v5.14; |
|
1
|
|
|
|
|
16
|
|
9
|
1
|
|
|
1
|
|
7
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
116
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
require XSLoader; |
12
|
|
|
|
|
|
|
XSLoader::load( __PACKAGE__, our $VERSION ); |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
=head1 NAME |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
C - enable extended features when parsing C-like syntax |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
=head1 SYNOPSIS |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
use v5.26; |
21
|
|
|
|
|
|
|
use Sublike::Extended; |
22
|
|
|
|
|
|
|
use experimental 'signatures'; |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
extended sub greet (:$name = "world") { |
25
|
|
|
|
|
|
|
say "Hello, $name"; |
26
|
|
|
|
|
|
|
} |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
greet( name => $ENV{USER} ); |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=head1 DESCRIPTION |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
This module extends the syntax for declaring named or anonymous subroutines |
33
|
|
|
|
|
|
|
using Perl's builtin C keyword, or other similar keywords provided by |
34
|
|
|
|
|
|
|
third-party modules, to enable parsing of extra features. |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
Currently, the only extended features that are provided are related to the |
37
|
|
|
|
|
|
|
parsing of a subroutine signature. Since signatures are only available on Perl |
38
|
|
|
|
|
|
|
version 5.26 or later, this module is unlikely to be useful in earlier |
39
|
|
|
|
|
|
|
versions of Perl. |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
=head2 Named parameters |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
Extended subroutines can be declare named parameters in the signature, after |
44
|
|
|
|
|
|
|
any positional ones. These take the form of a name prefixed by a colon |
45
|
|
|
|
|
|
|
character. The caller of such a function should pass values for these |
46
|
|
|
|
|
|
|
parameters by the usual name-value pair syntax that would be used for passing |
47
|
|
|
|
|
|
|
into a regular hash. Within the body of the subroutine the values passed into |
48
|
|
|
|
|
|
|
these are unpacked into regular lexical variables. |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
extended sub colour (:$red, :$green, :$blue) { |
51
|
|
|
|
|
|
|
... # $red, $green and $blue are available as regular lexicals |
52
|
|
|
|
|
|
|
} |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
# argument order at the caller site is not important |
55
|
|
|
|
|
|
|
colour(green => 1, blue => 2, red => 3); |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
As with positional parameters, they are normally mandatory, but can be made |
58
|
|
|
|
|
|
|
optional by supplying a defaulting expression. If the caller fails to pass a |
59
|
|
|
|
|
|
|
value corresponding to the parameter, the default expression is evaluated and |
60
|
|
|
|
|
|
|
used instead. |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
extended sub f (:$x0, :$x1, :$x2 = 0) { ... } |
63
|
|
|
|
|
|
|
# The caller must provide x0 and x1, but x2 is optional |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
An optional slurpy hash is also permitted after all of these. It will contain |
66
|
|
|
|
|
|
|
the values of any other name-value pairs given by the caller, after those |
67
|
|
|
|
|
|
|
corresponding to named parameters have already been extracted. |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
extended sub g (:$alpha, :$beta, %rest) { ... } |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
=head2 Parameter Attributes |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
Parameters to extended subroutines can use attribute syntax to apply extra |
74
|
|
|
|
|
|
|
attributes to individual parameters. |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
extended sub info ($x :Attribute) { ... } |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
Any attributes that are available are ones that have been previously |
79
|
|
|
|
|
|
|
registered with L using its XS-level API. The particular |
80
|
|
|
|
|
|
|
behaviour of such an attribute would be defined by whatever module provided |
81
|
|
|
|
|
|
|
the attribute. |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=head1 KEYWORDS |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=head2 extended |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
extended sub NAME (SIGNATURE...) { BODY... } |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
extended sub (SIGNATURE...) { BODY... }; |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
This prefix keyword enables extra parsing features when handling a C (or |
92
|
|
|
|
|
|
|
other sub-like function keyword). |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
This keyword can be freely mixed with other C-prefix keywords, such as |
95
|
|
|
|
|
|
|
C from L |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
async extended sub f (:$param) { ... } |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
This can also be used with other keywords that provide C-like syntax, |
100
|
|
|
|
|
|
|
such as C from L or the core C |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
extended method f (:$param) { ... } |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
=cut |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
sub import |
107
|
|
|
|
|
|
|
{ |
108
|
1
|
|
|
1
|
|
377
|
$^H{"Sublike::Extended/extended"}++; |
109
|
|
|
|
|
|
|
} |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
sub unimport |
112
|
|
|
|
|
|
|
{ |
113
|
0
|
|
|
0
|
|
|
delete $^H{"Sublike::Extended/extended"}; |
114
|
|
|
|
|
|
|
} |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
=head1 AUTHOR |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
Paul Evans |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
=cut |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
0x55AA; |