This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #119045] Make list constant mutable again
[perl5.git] / dist / constant / lib / constant.pm
1 package constant;
2 use 5.008;
3 use strict;
4 use warnings::register;
5
6 use vars qw($VERSION %declared);
7 $VERSION = '1.28';
8
9 #=======================================================================
10
11 # Some names are evil choices.
12 my %keywords = map +($_, 1), qw{ BEGIN INIT CHECK END DESTROY AUTOLOAD };
13 $keywords{UNITCHECK}++ if $] > 5.009;
14
15 my %forced_into_main = map +($_, 1),
16     qw{ STDIN STDOUT STDERR ARGV ARGVOUT ENV INC SIG };
17
18 my %forbidden = (%keywords, %forced_into_main);
19
20 my $normal_constant_name = qr/^_?[^\W_0-9]\w*\z/;
21 my $tolerable = qr/^[A-Za-z_]\w*\z/;
22 my $boolean = qr/^[01]?\z/;
23
24 BEGIN {
25     # We'd like to do use constant _CAN_PCS => $] > 5.009002
26     # but that's a bit tricky before we load the constant module :-)
27     # By doing this, we save 1 run time check for *every* call to import.
28     my $const = $] > 5.009002;
29     my $downgrade = $] < 5.015004; # && $] >= 5.008
30     my $constarray = $] >= 5.019003;
31     if ($const) {
32         Internals::SvREADONLY($const, 1);
33         Internals::SvREADONLY($downgrade, 1);
34         $constant::{_CAN_PCS}   = \$const;
35         $constant::{_DOWNGRADE} = \$downgrade;
36         $constant::{_CAN_PCS_FOR_ARRAY} = \$constarray;
37     }
38     else {
39         no strict 'refs';
40         *{"_CAN_PCS"}   = sub () {$const};
41         *{"_DOWNGRADE"} = sub () { $downgrade };
42         *{"_CAN_PCS_FOR_ARRAY"} = sub () { $constarray };
43     }
44 }
45
46 #=======================================================================
47 # import() - import symbols into user's namespace
48 #
49 # What we actually do is define a function in the caller's namespace
50 # which returns the value. The function we create will normally
51 # be inlined as a constant, thereby avoiding further sub calling 
52 # overhead.
53 #=======================================================================
54 sub import {
55     my $class = shift;
56     return unless @_;                   # Ignore 'use constant;'
57     my $constants;
58     my $multiple  = ref $_[0];
59     my $pkg = caller;
60     my $flush_mro;
61     my $symtab;
62
63     if (_CAN_PCS) {
64         no strict 'refs';
65         $symtab = \%{$pkg . '::'};
66     };
67
68     if ( $multiple ) {
69         if (ref $_[0] ne 'HASH') {
70             require Carp;
71             Carp::croak("Invalid reference type '".ref(shift)."' not 'HASH'");
72         }
73         $constants = shift;
74     } else {
75         unless (defined $_[0]) {
76             require Carp;
77             Carp::croak("Can't use undef as constant name");
78         }
79         $constants->{+shift} = undef;
80     }
81
82     foreach my $name ( keys %$constants ) {
83         # Normal constant name
84         if ($name =~ $normal_constant_name and !$forbidden{$name}) {
85             # Everything is okay
86
87         # Name forced into main, but we're not in main. Fatal.
88         } elsif ($forced_into_main{$name} and $pkg ne 'main') {
89             require Carp;
90             Carp::croak("Constant name '$name' is forced into main::");
91
92         # Starts with double underscore. Fatal.
93         } elsif ($name =~ /^__/) {
94             require Carp;
95             Carp::croak("Constant name '$name' begins with '__'");
96
97         # Maybe the name is tolerable
98         } elsif ($name =~ $tolerable) {
99             # Then we'll warn only if you've asked for warnings
100             if (warnings::enabled()) {
101                 if ($keywords{$name}) {
102                     warnings::warn("Constant name '$name' is a Perl keyword");
103                 } elsif ($forced_into_main{$name}) {
104                     warnings::warn("Constant name '$name' is " .
105                         "forced into package main::");
106                 }
107             }
108
109         # Looks like a boolean
110         # use constant FRED == fred;
111         } elsif ($name =~ $boolean) {
112             require Carp;
113             if (@_) {
114                 Carp::croak("Constant name '$name' is invalid");
115             } else {
116                 Carp::croak("Constant name looks like boolean value");
117             }
118
119         } else {
120            # Must have bad characters
121             require Carp;
122             Carp::croak("Constant name '$name' has invalid characters");
123         }
124
125         {
126             no strict 'refs';
127             my $full_name = "${pkg}::$name";
128             $declared{$full_name}++;
129             if ($multiple || @_ == 1) {
130                 my $scalar = $multiple ? $constants->{$name} : $_[0];
131
132                 if (_DOWNGRADE) { # for 5.8 to 5.14
133                     # Work around perl bug #31991: Sub names (actually glob
134                     # names in general) ignore the UTF8 flag. So we have to
135                     # turn it off to get the "right" symbol table entry.
136                     utf8::is_utf8 $name and utf8::encode $name;
137                 }
138
139                 # The constant serves to optimise this entire block out on
140                 # 5.8 and earlier.
141                 if (_CAN_PCS) {
142                     # Use a reference as a proxy for a constant subroutine.
143                     # If this is not a glob yet, it saves space.  If it is
144                     # a glob, we must still create it this way to get the
145                     # right internal flags set, as constants are distinct
146                     # from subroutines created with sub(){...}.
147                     # The check in Perl_ck_rvconst knows that inlinable
148                     # constants from cv_const_sv are read only. So we have to:
149                     Internals::SvREADONLY($scalar, 1);
150                     if ($symtab && !exists $symtab->{$name}) {
151                         $symtab->{$name} = \$scalar;
152                         ++$flush_mro;
153                     }
154                     else {
155                         local $constant::{_dummy} = \$scalar;
156                         *$full_name = \&{"_dummy"};
157                     }
158                 } else {
159                     *$full_name = sub () { $scalar };
160                 }
161             } elsif (@_) {
162                 my @list = @_;
163                 if (_CAN_PCS_FOR_ARRAY) {
164                     Internals::SvREADONLY(@list, 1);
165                     # Disabled for now; see perl #119045:
166                     #Internals::SvREADONLY($list[$_], 1) for 0..$#list;
167                     if ($symtab && !exists $symtab->{$name}) {
168                         $symtab->{$name} = \@list;
169                         $flush_mro++;
170                     }
171                     else {
172                         local $constant::{_dummy} = \@list;
173                         *$full_name = \&{"_dummy"};
174                     }
175                 }
176                 else { *$full_name = sub () { @list }; }
177             } else {
178                 *$full_name = sub () { };
179             }
180         }
181     }
182     # Flush the cache exactly once if we make any direct symbol table changes.
183     mro::method_changed_in($pkg) if _CAN_PCS && $flush_mro;
184 }
185
186 1;
187
188 __END__
189
190 =head1 NAME
191
192 constant - Perl pragma to declare constants
193
194 =head1 SYNOPSIS
195
196     use constant PI    => 4 * atan2(1, 1);
197     use constant DEBUG => 0;
198
199     print "Pi equals ", PI, "...\n" if DEBUG;
200
201     use constant {
202         SEC   => 0,
203         MIN   => 1,
204         HOUR  => 2,
205         MDAY  => 3,
206         MON   => 4,
207         YEAR  => 5,
208         WDAY  => 6,
209         YDAY  => 7,
210         ISDST => 8,
211     };
212
213     use constant WEEKDAYS => qw(
214         Sunday Monday Tuesday Wednesday Thursday Friday Saturday
215     );
216
217     print "Today is ", (WEEKDAYS)[ (localtime)[WDAY] ], ".\n";
218
219 =head1 DESCRIPTION
220
221 This pragma allows you to declare constants at compile-time.
222
223 When you declare a constant such as C<PI> using the method shown
224 above, each machine your script runs upon can have as many digits
225 of accuracy as it can use. Also, your program will be easier to
226 read, more likely to be maintained (and maintained correctly), and
227 far less likely to send a space probe to the wrong planet because
228 nobody noticed the one equation in which you wrote C<3.14195>.
229
230 When a constant is used in an expression, Perl replaces it with its
231 value at compile time, and may then optimize the expression further.
232 In particular, any code in an C<if (CONSTANT)> block will be optimized
233 away if the constant is false.
234
235 =head1 NOTES
236
237 As with all C<use> directives, defining a constant happens at
238 compile time. Thus, it's probably not correct to put a constant
239 declaration inside of a conditional statement (like C<if ($foo)
240 { use constant ... }>).
241
242 Constants defined using this module cannot be interpolated into
243 strings like variables.  However, concatenation works just fine:
244
245     print "Pi equals PI...\n";        # WRONG: does not expand "PI"
246     print "Pi equals ".PI."...\n";    # right
247
248 Even though a reference may be declared as a constant, the reference may
249 point to data which may be changed, as this code shows.
250
251     use constant ARRAY => [ 1,2,3,4 ];
252     print ARRAY->[1];
253     ARRAY->[1] = " be changed";
254     print ARRAY->[1];
255
256 Dereferencing constant references incorrectly (such as using an array
257 subscript on a constant hash reference, or vice versa) will be trapped at
258 compile time.
259
260 Constants belong to the package they are defined in.  To refer to a
261 constant defined in another package, specify the full package name, as
262 in C<Some::Package::CONSTANT>.  Constants may be exported by modules,
263 and may also be called as either class or instance methods, that is,
264 as C<< Some::Package->CONSTANT >> or as C<< $obj->CONSTANT >> where
265 C<$obj> is an instance of C<Some::Package>.  Subclasses may define
266 their own constants to override those in their base class.
267
268 The use of all caps for constant names is merely a convention,
269 although it is recommended in order to make constants stand out
270 and to help avoid collisions with other barewords, keywords, and
271 subroutine names. Constant names must begin with a letter or
272 underscore. Names beginning with a double underscore are reserved. Some
273 poor choices for names will generate warnings, if warnings are enabled at
274 compile time.
275
276 =head2 List constants
277
278 Constants may be lists of more (or less) than one value.  A constant
279 with no values evaluates to C<undef> in scalar context.  Note that
280 constants with more than one value do I<not> return their last value in
281 scalar context as one might expect.  They currently return the number
282 of values, but B<this may change in the future>.  Do not use constants
283 with multiple values in scalar context.
284
285 B<NOTE:> This implies that the expression defining the value of a
286 constant is evaluated in list context.  This may produce surprises:
287
288     use constant TIMESTAMP => localtime;                # WRONG!
289     use constant TIMESTAMP => scalar localtime;         # right
290
291 The first line above defines C<TIMESTAMP> as a 9-element list, as
292 returned by C<localtime()> in list context.  To set it to the string
293 returned by C<localtime()> in scalar context, an explicit C<scalar>
294 keyword is required.
295
296 List constants are lists, not arrays.  To index or slice them, they
297 must be placed in parentheses.
298
299     my @workdays = WEEKDAYS[1 .. 5];            # WRONG!
300     my @workdays = (WEEKDAYS)[1 .. 5];          # right
301
302 =head2 Defining multiple constants at once
303
304 Instead of writing multiple C<use constant> statements, you may define
305 multiple constants in a single statement by giving, instead of the
306 constant name, a reference to a hash where the keys are the names of
307 the constants to be defined.  Obviously, all constants defined using
308 this method must have a single value.
309
310     use constant {
311         FOO => "A single value",
312         BAR => "This", "won't", "work!",        # Error!
313     };
314
315 This is a fundamental limitation of the way hashes are constructed in
316 Perl.  The error messages produced when this happens will often be
317 quite cryptic -- in the worst case there may be none at all, and
318 you'll only later find that something is broken.
319
320 When defining multiple constants, you cannot use the values of other
321 constants defined in the same declaration.  This is because the
322 calling package doesn't know about any constant within that group
323 until I<after> the C<use> statement is finished.
324
325     use constant {
326         BITMASK => 0xAFBAEBA8,
327         NEGMASK => ~BITMASK,                    # Error!
328     };
329
330 =head2 Magic constants
331
332 Magical values and references can be made into constants at compile
333 time, allowing for way cool stuff like this.  (These error numbers
334 aren't totally portable, alas.)
335
336     use constant E2BIG => ($! = 7);
337     print   E2BIG, "\n";        # something like "Arg list too long"
338     print 0+E2BIG, "\n";        # "7"
339
340 You can't produce a tied constant by giving a tied scalar as the
341 value.  References to tied variables, however, can be used as
342 constants without any problems.
343
344 =head1 TECHNICAL NOTES
345
346 In the current implementation, scalar constants are actually
347 inlinable subroutines. As of version 5.004 of Perl, the appropriate
348 scalar constant is inserted directly in place of some subroutine
349 calls, thereby saving the overhead of a subroutine call. See
350 L<perlsub/"Constant Functions"> for details about how and when this
351 happens.
352
353 In the rare case in which you need to discover at run time whether a
354 particular constant has been declared via this module, you may use
355 this function to examine the hash C<%constant::declared>. If the given
356 constant name does not include a package name, the current package is
357 used.
358
359     sub declared ($) {
360         use constant 1.01;              # don't omit this!
361         my $name = shift;
362         $name =~ s/^::/main::/;
363         my $pkg = caller;
364         my $full_name = $name =~ /::/ ? $name : "${pkg}::$name";
365         $constant::declared{$full_name};
366     }
367
368 =head1 CAVEATS
369
370 List constants are not inlined unless you are using Perl v5.20 or higher.
371
372 It is not possible to have a subroutine or a keyword with the same
373 name as a constant in the same package. This is probably a Good Thing.
374
375 A constant with a name in the list C<STDIN STDOUT STDERR ARGV ARGVOUT
376 ENV INC SIG> is not allowed anywhere but in package C<main::>, for
377 technical reasons. 
378
379 Unlike constants in some languages, these cannot be overridden
380 on the command line or via environment variables.
381
382 You can get into trouble if you use constants in a context which
383 automatically quotes barewords (as is true for any subroutine call).
384 For example, you can't say C<$hash{CONSTANT}> because C<CONSTANT> will
385 be interpreted as a string.  Use C<$hash{CONSTANT()}> or
386 C<$hash{+CONSTANT}> to prevent the bareword quoting mechanism from
387 kicking in.  Similarly, since the C<< => >> operator quotes a bareword
388 immediately to its left, you have to say C<< CONSTANT() => 'value' >>
389 (or simply use a comma in place of the big arrow) instead of
390 C<< CONSTANT => 'value' >>.
391
392 =head1 SEE ALSO
393
394 L<Readonly> - Facility for creating read-only scalars, arrays, hashes.
395
396 L<Attribute::Constant> - Make read-only variables via attribute
397
398 L<Scalar::Readonly> - Perl extension to the C<SvREADONLY> scalar flag
399
400 L<Hash::Util> - A selection of general-utility hash subroutines (mostly
401 to lock/unlock keys and values)
402
403 =head1 BUGS
404
405 Please report any bugs or feature requests via the perlbug(1) utility.
406
407 =head1 AUTHORS
408
409 Tom Phoenix, E<lt>F<rootbeer@redcat.com>E<gt>, with help from
410 many other folks.
411
412 Multiple constant declarations at once added by Casey West,
413 E<lt>F<casey@geeknest.com>E<gt>.
414
415 Documentation mostly rewritten by Ilmari Karonen,
416 E<lt>F<perl@itz.pp.sci.fi>E<gt>.
417
418 This program is maintained by the Perl 5 Porters. 
419 The CPAN distribution is maintained by SE<eacute>bastien Aperghis-Tramoni
420 E<lt>F<sebastien@aperghis.net>E<gt>.
421
422 =head1 COPYRIGHT & LICENSE
423
424 Copyright (C) 1997, 1999 Tom Phoenix
425
426 This module is free software; you can redistribute it or modify it
427 under the same terms as Perl itself.
428
429 =cut