This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
constant.pm: Make list constants read-only
[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.019001;
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                     Internals::SvREADONLY($list[$_], 1) for 0..$#list;
166                     if ($symtab && !exists $symtab->{$name}) {
167                         $symtab->{$name} = \@list;
168                         $flush_mro++;
169                     }
170                     else {
171                         local $constant::{_dummy} = \@list;
172                         *$full_name = \&{"_dummy"};
173                     }
174                 }
175                 else { *$full_name = sub () { @list }; }
176             } else {
177                 *$full_name = sub () { };
178             }
179         }
180     }
181     # Flush the cache exactly once if we make any direct symbol table changes.
182     mro::method_changed_in($pkg) if _CAN_PCS && $flush_mro;
183 }
184
185 1;
186
187 __END__
188
189 =head1 NAME
190
191 constant - Perl pragma to declare constants
192
193 =head1 SYNOPSIS
194
195     use constant PI    => 4 * atan2(1, 1);
196     use constant DEBUG => 0;
197
198     print "Pi equals ", PI, "...\n" if DEBUG;
199
200     use constant {
201         SEC   => 0,
202         MIN   => 1,
203         HOUR  => 2,
204         MDAY  => 3,
205         MON   => 4,
206         YEAR  => 5,
207         WDAY  => 6,
208         YDAY  => 7,
209         ISDST => 8,
210     };
211
212     use constant WEEKDAYS => qw(
213         Sunday Monday Tuesday Wednesday Thursday Friday Saturday
214     );
215
216     print "Today is ", (WEEKDAYS)[ (localtime)[WDAY] ], ".\n";
217
218 =head1 DESCRIPTION
219
220 This pragma allows you to declare constants at compile-time.
221
222 When you declare a constant such as C<PI> using the method shown
223 above, each machine your script runs upon can have as many digits
224 of accuracy as it can use. Also, your program will be easier to
225 read, more likely to be maintained (and maintained correctly), and
226 far less likely to send a space probe to the wrong planet because
227 nobody noticed the one equation in which you wrote C<3.14195>.
228
229 When a constant is used in an expression, Perl replaces it with its
230 value at compile time, and may then optimize the expression further.
231 In particular, any code in an C<if (CONSTANT)> block will be optimized
232 away if the constant is false.
233
234 =head1 NOTES
235
236 As with all C<use> directives, defining a constant happens at
237 compile time. Thus, it's probably not correct to put a constant
238 declaration inside of a conditional statement (like C<if ($foo)
239 { use constant ... }>).
240
241 Constants defined using this module cannot be interpolated into
242 strings like variables.  However, concatenation works just fine:
243
244     print "Pi equals PI...\n";        # WRONG: does not expand "PI"
245     print "Pi equals ".PI."...\n";    # right
246
247 Even though a reference may be declared as a constant, the reference may
248 point to data which may be changed, as this code shows.
249
250     use constant ARRAY => [ 1,2,3,4 ];
251     print ARRAY->[1];
252     ARRAY->[1] = " be changed";
253     print ARRAY->[1];
254
255 Dereferencing constant references incorrectly (such as using an array
256 subscript on a constant hash reference, or vice versa) will be trapped at
257 compile time.
258
259 Constants belong to the package they are defined in.  To refer to a
260 constant defined in another package, specify the full package name, as
261 in C<Some::Package::CONSTANT>.  Constants may be exported by modules,
262 and may also be called as either class or instance methods, that is,
263 as C<< Some::Package->CONSTANT >> or as C<< $obj->CONSTANT >> where
264 C<$obj> is an instance of C<Some::Package>.  Subclasses may define
265 their own constants to override those in their base class.
266
267 The use of all caps for constant names is merely a convention,
268 although it is recommended in order to make constants stand out
269 and to help avoid collisions with other barewords, keywords, and
270 subroutine names. Constant names must begin with a letter or
271 underscore. Names beginning with a double underscore are reserved. Some
272 poor choices for names will generate warnings, if warnings are enabled at
273 compile time.
274
275 =head2 List constants
276
277 Constants may be lists of more (or less) than one value.  A constant
278 with no values evaluates to C<undef> in scalar context.  Note that
279 constants with more than one value do I<not> return their last value in
280 scalar context as one might expect.  They currently return the number
281 of values, but B<this may change in the future>.  Do not use constants
282 with multiple values in scalar context.
283
284 B<NOTE:> This implies that the expression defining the value of a
285 constant is evaluated in list context.  This may produce surprises:
286
287     use constant TIMESTAMP => localtime;                # WRONG!
288     use constant TIMESTAMP => scalar localtime;         # right
289
290 The first line above defines C<TIMESTAMP> as a 9-element list, as
291 returned by C<localtime()> in list context.  To set it to the string
292 returned by C<localtime()> in scalar context, an explicit C<scalar>
293 keyword is required.
294
295 List constants are lists, not arrays.  To index or slice them, they
296 must be placed in parentheses.
297
298     my @workdays = WEEKDAYS[1 .. 5];            # WRONG!
299     my @workdays = (WEEKDAYS)[1 .. 5];          # right
300
301 =head2 Defining multiple constants at once
302
303 Instead of writing multiple C<use constant> statements, you may define
304 multiple constants in a single statement by giving, instead of the
305 constant name, a reference to a hash where the keys are the names of
306 the constants to be defined.  Obviously, all constants defined using
307 this method must have a single value.
308
309     use constant {
310         FOO => "A single value",
311         BAR => "This", "won't", "work!",        # Error!
312     };
313
314 This is a fundamental limitation of the way hashes are constructed in
315 Perl.  The error messages produced when this happens will often be
316 quite cryptic -- in the worst case there may be none at all, and
317 you'll only later find that something is broken.
318
319 When defining multiple constants, you cannot use the values of other
320 constants defined in the same declaration.  This is because the
321 calling package doesn't know about any constant within that group
322 until I<after> the C<use> statement is finished.
323
324     use constant {
325         BITMASK => 0xAFBAEBA8,
326         NEGMASK => ~BITMASK,                    # Error!
327     };
328
329 =head2 Magic constants
330
331 Magical values and references can be made into constants at compile
332 time, allowing for way cool stuff like this.  (These error numbers
333 aren't totally portable, alas.)
334
335     use constant E2BIG => ($! = 7);
336     print   E2BIG, "\n";        # something like "Arg list too long"
337     print 0+E2BIG, "\n";        # "7"
338
339 You can't produce a tied constant by giving a tied scalar as the
340 value.  References to tied variables, however, can be used as
341 constants without any problems.
342
343 =head1 TECHNICAL NOTES
344
345 In the current implementation, scalar constants are actually
346 inlinable subroutines. As of version 5.004 of Perl, the appropriate
347 scalar constant is inserted directly in place of some subroutine
348 calls, thereby saving the overhead of a subroutine call. See
349 L<perlsub/"Constant Functions"> for details about how and when this
350 happens.
351
352 In the rare case in which you need to discover at run time whether a
353 particular constant has been declared via this module, you may use
354 this function to examine the hash C<%constant::declared>. If the given
355 constant name does not include a package name, the current package is
356 used.
357
358     sub declared ($) {
359         use constant 1.01;              # don't omit this!
360         my $name = shift;
361         $name =~ s/^::/main::/;
362         my $pkg = caller;
363         my $full_name = $name =~ /::/ ? $name : "${pkg}::$name";
364         $constant::declared{$full_name};
365     }
366
367 =head1 CAVEATS
368
369 In the current version of Perl, list constants are not inlined
370 and some symbols may be redefined without generating a warning.
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