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

Reply via email to