This and other RFCs are available on the web at
  http://dev.perl.org/rfc/

=head1 TITLE

my() syntax extensions and attribute declarations

=head1 VERSION

  Maintainer: Nathan Wiger <[EMAIL PROTECTED]>
  Date: 24 Sep 2000
  Last Modified: 30 Sep 2000
  Mailing List: [EMAIL PROTECTED]
  Number: 279
  Version: 2
  Status: Frozen

=head1 ABSTRACT

This RFC fleshes out variable declarations with C<my>, and also proposes
a way to assign attributes without the need for a C<my> anywhere. Much
of this stuff has been hinted at, so this is just a formalization.

Please note this entire document is B<optional>, intended for those that
need this type of control. Perl is not a B&D language (by default, at
least :).

=head1 DESCRIPTION

Camel-3 shows some interesting hints of what's been proposed for C<my>
declarations:

   my type $var :attr1 :attr2 = $value;

And we all know that you can use C<my> to declare a group of variables:

   my($x, $y, $z);

Here's the issues:

   1. How do the two jive together?
  
   2. Should it be possible to assign attributes to individual elements
      of hashes/arrays? (yes)

=head2 Cohesive C<my> syntax

This RFC proposes that you be able to group multiple variables of the
same type within parens:

   my int ($x, $y, $z);
   my int ($x :64bit, $y :32bit, $z);

It seems most logical that:

   1. The type will be the same across variables; this is common
      usage in other languages because it makes sense.

   2. The attributes will be different for different variables.

As such, multiple attributes can be assigned and grouped flexibly:

   my int ($x, $y, $z) :64bit;           # all are 64-bit
   my int ($x, $y, $z :unsigned) :64bit; # plus $z is unsigned

Note that multiple types cannot be specified on the same line. To
declare variables of multiple types, you must use separate statements:

   my int ($x, $y, $z) :64bit;
   my string ($firstname, $lastname :long);

This is consistent with other languages and also makes parsing
realistic.

=head2 Assigning attributes to individual elements of hashes/arrays

This is potentially very useful. ":laccess", ":raccess", ":public",
":private", and others spring to mind as potential candidates for this.
This RFC proposes that in addition to attributes being assigned to a
whole entity on declaration:

   my int @a :64bit;       # makes each element a 64-bit int
   my string %h :long;     # each key/val is long string

They can also be declared on individual elements, without the need for
C<my> or C<our>:

   $a[0] :32bit = get_val;           # 32-bit
   $r->{name} :private = "Nate";     # privatize single value
   $s->{VAL} :laccess('data') = "";  # lvalue autoaccessor

Assigning attributes to individual elements has the advantage over
keywords of allowing them to be grouped:

   $self->{name} :public :roaccess('getname') = "Nathan Wiger";

However, a problem arises in how to assign types to singular elements,
since this requires a C<my>:

   my int $a[0] :64bit;     # just makes that single element
                            # a lexically-scoped 64-bit int?

   my string $h{name} = ""; # cast $h{name} to string, rescope %h?

Currently, lexical scope has no meaning for individual elements of
hashes and arrays. However, assigning attributes and even types to
individual elements seems useful. There's two ways around this that I
see:

   1. On my'ing of an individual hash/array element, the
      entire hash/array is rescoped to the nearest block.

   2. Only the individual element is rescoped, similar
      to what happens when you do this:

          my $x = 5;
          {
             my $x = 10;
          }

Either of these solutions is acceptable, and they both have their pluses
and minuses. The second one seems more consistent, but is potentially
extremely difficult to implement.

=head1 IMPLEMENTATION

Hold on.

=head1 MIGRATION

None. This introduces a more flexible syntax but does not break old
ones.

=head1 REFERENCES

RFC 337: Common attribute system to allow user-defined, extensible attributes

RFC 319: Transparently integrate C<tie>

Camel for the C<my> syntax.

C<attributes> man page for details on attributes.

Reply via email to