This and other RFCs are available on the web at http://dev.perl.org/rfc/ =head1 TITLE Formats out of core / New format syntax =head1 VERSION Maintainer: Nathan Wiger <[EMAIL PROTECTED]> Date: 30 Aug 2000 Mailing List: [EMAIL PROTECTED] Version: 1 Number: 181 Status: Developing =head1 ABSTRACT There has been much hinting at moving formats out of core. This RFC proposes one way to do this, at the same time standardizing the syntax. =head1 DESCRIPTION =head2 Overview Currently, the general consensus is that formats aren't widely used enough to justify their living in the core binary. [1] However, they are incredibly useful, and need to remain in the core distribution no matter what. Under this RFC, formats will be available through a simple: use Format; The rest of the RFC will address specific changes in syntax to make this possible (and more consistent too). =head2 Current Syntax Currently, formats must be named for the bareword filehandle that they're going to be used on, for example: format FILE = @<<<<<<<<<<<<<: @<<<<<<<< $name, $ssn . open FILE, ">>$file"; write FILE; Some behind the scenes magic is done to bind these two together. In order to change the format name, you have to use the following statements: $old = select FILE; $~ = MYCUSTOMFORMAT; select $old; Getting this syntax to work as a module would be a collosal headache. In addition, it's pretty peculiar to begin with. As such, a new but very similar syntax is proposed. =head2 New Syntax Under the new syntax, a format will be held in a variable of the C<format> type: my format $FILE_FORMAT = q( @<<<<<<<<<<<<<: @<<<<<<<< $name, $ssn ); Note that declaring the format is remarkably similar to the current form. However, it now can be handled with the existing variable syntax, simplifying implementation. [2] Using formats, however, requires one extra step, since there is no longer any intrinsic property tying formats and filehandles together: open $FILE, ">>$file"; format $FILE ($FILE_FORMAT); # $FILE->format($FILE_FORMAT) write $FILE; # $FILE->write Note, however, that this does get rid of the need to do all the special C<select> statements. The C<format> and C<write> methods could simply be member functions of the C<$FILE> object. However, I don't particularly like extra steps, personally. One way around this would be to assume the default format is C<[handle]_FORMAT>, meaning C<$FILE>'s default format would be C<$FILE_FORMAT>. This would make behavior very similar to current, and would make the above extra step unnecessary. More clever ways of doing this probably exist as well. Finally, note that if L<RFC 174> is adopted, this can be made to look even more simple and consistent: open $FILE, ">>$file"; format $FILE, $FILE_FORMAT; # $FILE->format($FILE_FORMAT) write $FILE; # $FILE->write Since the indirect object and function syntaxes could be used interchangeably. =head1 IMPLEMENTATION Hold on. =head1 MIGRATION There is a need for migration, but I'd rather save this until later since this idea may get massively revised. =head1 NOTES [1] I personally disagree, but this RFC is close enough to make me happy. :-) [2] We might consider making a special case in the Perl parser so that if a variable is declared of type C<format> then the Perl 5 syntax can be used: my format $FILE_FORMAT = @<<<<<<<<<<<<<: @<<<<<<<< $name, $ssn . Then this is even less different and scary. Get rid of that C<my> and it's Perl 5. =head1 REFERENCES RFC 174 (v1): Parse C<func($obj, @args)> as C<func $obj (@args)>