On 8/16/00 12:37 PM, Perl6 RFC Librarian wrote:
> This RFC proposes that the current constant.pm module removed, and
> replaced with a syntax allowing any variable to be marked as constant.
Unfortunately, I submitted an nearly identical RFC yesterday because I
didn't see the existing one (I searched for "const" on the RFC homepage, I
swear! :)
I'm not sure if mine will end up getting posted, but in case it doesn't,
here are my comments/additions to RFC 83:
> It is proposed that a new syntax for declaring constants be introduced:
>
> my $PI : constant = 3.1415926;
> my @FIB : constant = (1,1,2,3,5,8,13,21);
> my %ENG_ERRORS : constant = (E_UNDEF=>'undefined', E_FAILED=>'failed');
>
> Constants can be lexically or globally scoped (or any other new scoping
> level yet to be defined).
I'm not crazy about the "attribute" syntax's use for constants. I prefer
this:
constant $PI = 3.1415926;
which nicely cleans up the my/our situation if you're not opposed to
chaining operators:
our constant $PI = 3.1415926;
if($urban_legend)
{
my constant $PI = 3.0;
...
}
> If an array or hash is marked constant, it cannot be assigned to, and its
> elements can not be assigned to:
>
> @FIB = (1,2,3); # Compile time error
> @FIB[0] = 2; # Compile time error
> %ENG_ERRORS=(); # Compile time error
> %ENG_ERRORS{E_UNDEF=>'No problem'} # Compile time error
I also extended this to ensure that nothing but reading can be done to
constant collections. So this is also true:
$#FIB = 100; # Compile-time error
(Not sure if that was implied in the examples given.)
> To create a reference to a constant use the reference operator:
>
> my $ref_pi = \$PI;
>
> To create a constant reference use a reference operator in the
> declaration:
>
> my $a = 'Nothing to declare';
> my $const_ref : constant = \$a;
I didn't address references, but I figured they would look like this:
my $a = 'Nothing to declare';
my constant $ref = \$a;
> EXTENSIONS
>
> It may be desirable to have a way to remove constness from a value. This
> will not be covered in this RFC--if it is required a separate RFC should
> be written referencing this one.
I didn't address this issue either, but my feeling is that it definitely
should NOT be possible to "remove const-ness" from a variable. Part of the
motivation for my constants RFC was the ability to do clever constant
folding at compile-time, even going so far as to fold this:
print $obj->method_returning_constant();
into the run-time equivalent of printing a constant string, when possible.
(A bit more detail is in my RFC, which, of course, is "in my other
computer" at the moment...and/or lost in the ether on its way to the RFC
address. I'd post the relevant section if I had it.)
-John