This and other RFCs are available on the web at http://dev.perl.org/rfc/ =head1 TITLE Built-in functions should be functions =head1 VERSION Maintainer: Johan Vromans <[EMAIL PROTECTED]> Date: 27 Aug 2000 Last Modified: 28 Aug 2000 Mailing List: [EMAIL PROTECTED] Version: 2 Number: 168 Status: Developing =head1 ABSTRACT RFC 26 proposes to eliminate the distinction between functions and operators from a language perspective. This RFC proposes that all Perl built-in functions should be usable in all ways normal functions can be used. It is part of a big consipracy to remove the number of cases with exceptional behaviour in Perl. =head1 DESCRIPTION Named operators, like C<abs>, can be called like functions in which case they behave like functions. However, that's where the similarity ends. You cannot override most builtins, and cannot tack a reference to them. There is no reason why the built-ins should be treated differently. A famous Perl saying reads "if it looks like a function, it B<is> a function." So be it. In particular, it is desired that every built-in =over 4 =item * can be overridden by a user defined subroutine; =item * can have a reference taken; =item * has a useful prototype. =back =head2 Overriding The principle of least surprise dictates that sub I<foo> { return 10 } print I<foo>(); should call I<foo>() and print "10" for all I<foo>. Currently, most built-ins are excluded from this. For example: sub system { return 10 } print system(); Instead of calling the user defined system(), the built-in is used. The second line may give a warning, but only if warnings are enabled: Ambiguous call resolved as CORE::system(), qualify as such or use & =head2 References You can call a built-in, but not take a reference. $a = \&system; print $a->(-1) This gives an error: Undefined subroutine &main::system called This should return a reference to the built-in instead. Since C<&>I<foo> implicitly refers to the current package, it would be acceptible to require $a = \&CORE::system; Note that this currently (5.7.0 DEVEL6806) results in the error: Undefined subroutine &CORE::system called which is surprising, if not misleading. =head2 Prototypes Currently, several built-ins do not provide prototype information. prototype("CORE::abs") ==> ;$ prototype("CORE::shift") ==> undef This must be fixed. One might even call this a bug, although the current prototype mechanism is not powerful enough to cope with all built-ins. =head1 REFERENCES RFC 26: Named operators versus functions Tom Christiansen in <12231.967154045@chthon> (perl6-internals, Aug 24, 2000).