This and other RFCs are available on the web at
http://dev.perl.org/rfc/
=head1 TITLE
Dominant Value Expressions
=head1 VERSION
Maintainer: Glenn Linderman <[EMAIL PROTECTED]>
Date: 29 Sep 2000
Last Modified: 30 Sep 2000
Mailing List: [EMAIL PROTECTED]
Number: 356
Version: 2
Status: Frozen
=head1 ABSTRACT
An aid to determining if an input value has an impact on the result of
an expression whole program. Can also be used for Perl poetry.
=head1 CHANGES
Version 2 adds output function, examples, and freezes.
=head1 DESCRIPTION
This is an optional feature; to turn it on, "use domination;" is
suggested.
When use domination is in scope, two new functions are available, and
new rules for expression evaluation obtain. Each of these is described
in a subsection below.
=head2 Domination pragma
The "use domination 'output-function-name';" pragma enables the rest of
the functionality. It should be scoped, affecting the current and
nested blocks. domination;", but allows user specification of a method
to use to convert dominant values to output strings. This is
implicitly called only when an output stream is passed a dominant
value. If an output-function-name is not supplied with "use
domination;", the following function is implied:
sub output-dominant-value {
return sprintf "DOMINANT(%g)", dominant_weight($_[0]);
}
The "no domination;" pragma would turn off the effect of "use
domination;" for the current and nested blocks. If a dominant value is
encountered while "no domination;" is in effect, it is treated as
"undef" by all scalar operators.
=head2 Dominant operation
The dominant operation takes a scalar argument, which is considered to
be a weight parameter. The scalar argument is converted to numeric, if
possible, with the resultant positive weight parameter producing a
dominant value with that given weight. A scalar argument that cannot
be automatically converted to numeric, or that produces a negative or
zero numeric value produces undef as a result.
dominant 47 # produces a dominant value of weight 47
dominant 0 # produces undef
dominant -47 # produces undef
dominant "ab" # produces undef
dominant "14" # produces a dominant value of weight 14
dominant undef # produces undef (and a warning if "use warnings")
=head2 Dominant_weight operation
The dominant_weight operation takes a scalar argument. If the scalar
argument is a dominant value, it returns its weight as a positive
number. If the scalar argument is not a dominant value, the return of
the dominant_weight operation is zero.
dominant_weight dominant 47 # produces 47
dominant_weight dominant 0 # produces 0
dominant_weight dominant -47 # produces 0
dominant_weight dominant "ab" # produces 0
dominant_weight dominant "14" # produces 14
dominant_weight 47 # produces 0
dominant_weight 0 # produces 0
dominant_weight "ab" # produces 0
dominant_weight "14" # produces 0
dominant_weight undef # produces 0 (and a warning if "use warnings")
=head2 Expressions involving dominant values
All scalar operations are affected by the presence of dominant values.
If a scalar operation other than the dominant_weight operation involves
one or more dominant values, the result of the operation is the
heaviest (by weight) dominant value among the operands. If no dominant
values are supplied to the operation, the result of the operation is
the same as it would be according to the usual definition of the
operation.
use domination;
$w = dominant 3;
$x = dominant 47;
$y = 33;
$z = "abc";
$x + $y # produces dominant 47
$w . $z # produces dominant 3
$w - $x # produces dominant 47
"$z $x" # produces dominant 47
$z =~ m/$w/; # produces dominant 3
$x =~ m/$z/; # produces dominant 47
defined $w # produces dominant 3
$x == $x # produces dominant 47
$w eq $w # produces dominant 3
$w > 17 # produces dominant 3
$x > 17 # produces dominant 47
print "Show me: $w\n" # same result as: print "DOMINANT(3)"
if ( $w ) # considered false
if ( dominant_weight $w > 17 ) # false
if ( dominant_weight $x > 17 ) # true
=head1 COMPATIBILITY
New functionality, no compatibility issues. The new functionality only
obtains if the "use domination;" pragma is in effect.
=head1 IMPLEMENTATION
The impact of dominant value expressions is pervasive, affecting all
builtin scalar operators in a minor way. Any operators doing item by
item operations on each scalar of a list or hash would be similarly
affected (various RFCs exist for extending scalar operations to work on
lists of values in "corresponding item" fashion).
=head1 REFERENCES
RFC 263: Add null() keyword and fundamental data type