Mention the syntax C<use feature ':5.10'> in feature.pm's synopsis
[p5sagit/p5-mst-13.2.git] / lib / overload.pm
CommitLineData
4633a7c4 1package overload;
2
98225a64 3our $VERSION = '1.04';
b75c8c73 4
a6006777 5sub nil {}
6
4633a7c4 7sub OVERLOAD {
8 $package = shift;
9 my %arg = @_;
a6006777 10 my ($sub, $fb);
11 $ {$package . "::OVERLOAD"}{dummy}++; # Register with magic by touching.
12 *{$package . "::()"} = \&nil; # Make it findable via fetchmethod.
4633a7c4 13 for (keys %arg) {
a6006777 14 if ($_ eq 'fallback') {
15 $fb = $arg{$_};
16 } else {
17 $sub = $arg{$_};
18 if (not ref $sub and $sub !~ /::/) {
44a8e56a 19 $ {$package . "::(" . $_} = $sub;
20 $sub = \&nil;
a6006777 21 }
22 #print STDERR "Setting `$ {'package'}::\cO$_' to \\&`$sub'.\n";
23 *{$package . "::(" . $_} = \&{ $sub };
24 }
4633a7c4 25 }
a6006777 26 ${$package . "::()"} = $fb; # Make it findable too (fallback only).
4633a7c4 27}
28
29sub import {
30 $package = (caller())[0];
31 # *{$package . "::OVERLOAD"} = \&OVERLOAD;
32 shift;
33 $package->overload::OVERLOAD(@_);
34}
35
36sub unimport {
37 $package = (caller())[0];
a6006777 38 ${$package . "::OVERLOAD"}{dummy}++; # Upgrade the table
4633a7c4 39 shift;
40 for (@_) {
a6006777 41 if ($_ eq 'fallback') {
42 undef $ {$package . "::()"};
43 } else {
44 delete $ {$package . "::"}{"(" . $_};
45 }
4633a7c4 46 }
47}
48
49sub Overloaded {
a6006777 50 my $package = shift;
51 $package = ref $package if ref $package;
52 $package->can('()');
4633a7c4 53}
54
44a8e56a 55sub ov_method {
56 my $globref = shift;
57 return undef unless $globref;
58 my $sub = \&{*$globref};
59 return $sub if $sub ne \&nil;
60 return shift->can($ {*$globref});
61}
62
4633a7c4 63sub OverloadedStringify {
a6006777 64 my $package = shift;
65 $package = ref $package if ref $package;
44a8e56a 66 #$package->can('(""')
ee239bfe 67 ov_method mycan($package, '(""'), $package
68 or ov_method mycan($package, '(0+'), $package
69 or ov_method mycan($package, '(bool'), $package
70 or ov_method mycan($package, '(nomethod'), $package;
4633a7c4 71}
72
73sub Method {
a6006777 74 my $package = shift;
75 $package = ref $package if ref $package;
44a8e56a 76 #my $meth = $package->can('(' . shift);
77 ov_method mycan($package, '(' . shift), $package;
78 #return $meth if $meth ne \&nil;
79 #return $ {*{$meth}};
4633a7c4 80}
81
82sub AddrRef {
a6006777 83 my $package = ref $_[0];
84 return "$_[0]" unless $package;
b3c0ec7c 85
86 require Scalar::Util;
87 my $class = Scalar::Util::blessed($_[0]);
88 my $class_prefix = defined($class) ? "$class=" : "";
89 my $type = Scalar::Util::reftype($_[0]);
90 my $addr = Scalar::Util::refaddr($_[0]);
91 return sprintf("$class_prefix$type(0x%x)", $addr);
4633a7c4 92}
93
1b1d102f 94*StrVal = *AddrRef;
4633a7c4 95
44a8e56a 96sub mycan { # Real can would leave stubs.
97 my ($package, $meth) = @_;
98 return \*{$package . "::$meth"} if defined &{$package . "::$meth"};
99 my $p;
100 foreach $p (@{$package . "::ISA"}) {
101 my $out = mycan($p, $meth);
102 return $out if $out;
103 }
104 return undef;
105}
106
b3ac6de7 107%constants = (
9cfe5470 108 'integer' => 0x1000, # HINT_NEW_INTEGER
109 'float' => 0x2000, # HINT_NEW_FLOAT
110 'binary' => 0x4000, # HINT_NEW_BINARY
111 'q' => 0x8000, # HINT_NEW_STRING
112 'qr' => 0x10000, # HINT_NEW_RE
b3ac6de7 113 );
114
ee239bfe 115%ops = ( with_assign => "+ - * / % ** << >> x .",
116 assign => "+= -= *= /= %= **= <<= >>= x= .=",
2877bd81 117 num_comparison => "< <= > >= == !=",
ee239bfe 118 '3way_comparison'=> "<=> cmp",
2877bd81 119 str_comparison => "lt le gt ge eq ne",
6dd85743 120 binary => '& &= | |= ^ ^=',
ee239bfe 121 unary => "neg ! ~",
122 mutators => '++ --',
f216259d 123 func => "atan2 cos sin exp abs log sqrt int",
ee239bfe 124 conversion => 'bool "" 0+',
f5284f61 125 iterators => '<>',
126 dereferencing => '${} @{} %{} &{} *{}',
ee239bfe 127 special => 'nomethod fallback =');
128
6b82e2f5 129use warnings::register;
b3ac6de7 130sub constant {
131 # Arguments: what, sub
132 while (@_) {
6b82e2f5 133 if (@_ == 1) {
4498a751 134 warnings::warnif ("Odd number of arguments for overload::constant");
6b82e2f5 135 last;
136 }
137 elsif (!exists $constants {$_ [0]}) {
4498a751 138 warnings::warnif ("`$_[0]' is not an overloadable type");
6b82e2f5 139 }
140 elsif (!ref $_ [1] || "$_[1]" !~ /CODE\(0x[\da-f]+\)$/) {
141 # Can't use C<ref $_[1] eq "CODE"> above as code references can be
142 # blessed, and C<ref> would return the package the ref is blessed into.
143 if (warnings::enabled) {
6b82e2f5 144 $_ [1] = "undef" unless defined $_ [1];
4498a751 145 warnings::warn ("`$_[1]' is not a code reference");
6b82e2f5 146 }
147 }
148 else {
149 $^H{$_[0]} = $_[1];
f22a2069 150 $^H |= $constants{$_[0]};
6b82e2f5 151 }
b3ac6de7 152 shift, shift;
153 }
154}
155
156sub remove_constant {
157 # Arguments: what, sub
158 while (@_) {
159 delete $^H{$_[0]};
160 $^H &= ~ $constants{$_[0]};
161 shift, shift;
162 }
163}
164
4633a7c4 1651;
166
167__END__
168
b267980d 169=head1 NAME
4633a7c4 170
7adf7a02 171overload - Package for overloading Perl operations
4633a7c4 172
173=head1 SYNOPSIS
174
175 package SomeThing;
176
b267980d 177 use overload
4633a7c4 178 '+' => \&myadd,
179 '-' => \&mysub;
180 # etc
181 ...
182
183 package main;
184 $a = new SomeThing 57;
185 $b=5+$a;
186 ...
187 if (overload::Overloaded $b) {...}
188 ...
189 $strval = overload::StrVal $b;
190
4633a7c4 191=head1 DESCRIPTION
192
193=head2 Declaration of overloaded functions
194
195The compilation directive
196
197 package Number;
198 use overload
b267980d 199 "+" => \&add,
4633a7c4 200 "*=" => "muas";
201
202declares function Number::add() for addition, and method muas() in
203the "class" C<Number> (or one of its base classes)
b267980d 204for the assignment form C<*=> of multiplication.
4633a7c4 205
206Arguments of this directive come in (key, value) pairs. Legal values
e7ea3e70 207are values legal inside a C<&{ ... }> call, so the name of a
208subroutine, a reference to a subroutine, or an anonymous subroutine
209will all work. Note that values specified as strings are
210interpreted as methods, not subroutines. Legal keys are listed below.
4633a7c4 211
212The subroutine C<add> will be called to execute C<$a+$b> if $a
213is a reference to an object blessed into the package C<Number>, or if $a is
214not an object from a package with defined mathemagic addition, but $b is a
215reference to a C<Number>. It can also be called in other situations, like
216C<$a+=7>, or C<$a++>. See L<MAGIC AUTOGENERATION>. (Mathemagical
217methods refer to methods triggered by an overloaded mathematical
218operator.)
219
774d564b 220Since overloading respects inheritance via the @ISA hierarchy, the
221above declaration would also trigger overloading of C<+> and C<*=> in
222all the packages which inherit from C<Number>.
e7ea3e70 223
4633a7c4 224=head2 Calling Conventions for Binary Operations
225
226The functions specified in the C<use overload ...> directive are called
227with three (in one particular case with four, see L<Last Resort>)
228arguments. If the corresponding operation is binary, then the first
229two arguments are the two arguments of the operation. However, due to
230general object calling conventions, the first argument should always be
231an object in the package, so in the situation of C<7+$a>, the
232order of the arguments is interchanged. It probably does not matter
233when implementing the addition method, but whether the arguments
234are reversed is vital to the subtraction method. The method can
235query this information by examining the third argument, which can take
236three different values:
237
238=over 7
239
240=item FALSE
241
242the order of arguments is as in the current operation.
243
244=item TRUE
245
246the arguments are reversed.
247
248=item C<undef>
249
250the current operation is an assignment variant (as in
251C<$a+=7>), but the usual function is called instead. This additional
ee239bfe 252information can be used to generate some optimizations. Compare
253L<Calling Conventions for Mutators>.
4633a7c4 254
255=back
256
257=head2 Calling Conventions for Unary Operations
258
259Unary operation are considered binary operations with the second
260argument being C<undef>. Thus the functions that overloads C<{"++"}>
261is called with arguments C<($a,undef,'')> when $a++ is executed.
262
ee239bfe 263=head2 Calling Conventions for Mutators
264
265Two types of mutators have different calling conventions:
266
88c28ceb 267=over
ee239bfe 268
269=item C<++> and C<-->
270
271The routines which implement these operators are expected to actually
272I<mutate> their arguments. So, assuming that $obj is a reference to a
273number,
274
275 sub incr { my $n = $ {$_[0]}; ++$n; $_[0] = bless \$n}
276
277is an appropriate implementation of overloaded C<++>. Note that
278
279 sub incr { ++$ {$_[0]} ; shift }
280
281is OK if used with preincrement and with postincrement. (In the case
282of postincrement a copying will be performed, see L<Copy Constructor>.)
283
284=item C<x=> and other assignment versions
285
286There is nothing special about these methods. They may change the
287value of their arguments, and may leave it as is. The result is going
288to be assigned to the value in the left-hand-side if different from
289this value.
290
f610777f 291This allows for the same method to be used as overloaded C<+=> and
ee239bfe 292C<+>. Note that this is I<allowed>, but not recommended, since by the
293semantic of L<"Fallback"> Perl will call the method for C<+> anyway,
294if C<+=> is not overloaded.
295
296=back
297
d1be9408 298B<Warning.> Due to the presence of assignment versions of operations,
b267980d 299routines which may be called in assignment context may create
300self-referential structures. Currently Perl will not free self-referential
ee239bfe 301structures until cycles are C<explicitly> broken. You may get problems
302when traversing your structures too.
303
b267980d 304Say,
ee239bfe 305
306 use overload '+' => sub { bless [ \$_[0], \$_[1] ] };
307
308is asking for trouble, since for code C<$obj += $foo> the subroutine
b267980d 309is called as C<$obj = add($obj, $foo, undef)>, or C<$obj = [\$obj,
ee239bfe 310\$foo]>. If using such a subroutine is an important optimization, one
311can overload C<+=> explicitly by a non-"optimized" version, or switch
b267980d 312to non-optimized version if C<not defined $_[2]> (see
ee239bfe 313L<Calling Conventions for Binary Operations>).
314
315Even if no I<explicit> assignment-variants of operators are present in
316the script, they may be generated by the optimizer. Say, C<",$obj,"> or
317C<',' . $obj . ','> may be both optimized to
318
319 my $tmp = ',' . $obj; $tmp .= ',';
320
4633a7c4 321=head2 Overloadable Operations
322
ee239bfe 323The following symbols can be specified in C<use overload> directive:
4633a7c4 324
325=over 5
326
327=item * I<Arithmetic operations>
328
329 "+", "+=", "-", "-=", "*", "*=", "/", "/=", "%", "%=",
330 "**", "**=", "<<", "<<=", ">>", ">>=", "x", "x=", ".", ".=",
331
332For these operations a substituted non-assignment variant can be called if
fa8a6580 333the assignment variant is not available. Methods for operations C<+>,
334C<->, C<+=>, and C<-=> can be called to automatically generate
335increment and decrement methods. The operation C<-> can be used to
4633a7c4 336autogenerate missing methods for unary minus or C<abs>.
337
ee239bfe 338See L<"MAGIC AUTOGENERATION">, L<"Calling Conventions for Mutators"> and
339L<"Calling Conventions for Binary Operations">) for details of these
340substitutions.
341
4633a7c4 342=item * I<Comparison operations>
343
344 "<", "<=", ">", ">=", "==", "!=", "<=>",
345 "lt", "le", "gt", "ge", "eq", "ne", "cmp",
346
347If the corresponding "spaceship" variant is available, it can be
348used to substitute for the missing operation. During C<sort>ing
349arrays, C<cmp> is used to compare values subject to C<use overload>.
350
351=item * I<Bit operations>
352
6dd85743 353 "&", "&=", "^", "^=", "|", "|=", "neg", "!", "~",
4633a7c4 354
fa8a6580 355C<neg> stands for unary minus. If the method for C<neg> is not
3bc6ec80 356specified, it can be autogenerated using the method for
fa8a6580 357subtraction. If the method for C<!> is not specified, it can be
358autogenerated using the methods for C<bool>, or C<"">, or C<0+>.
4633a7c4 359
6dd85743 360The same remarks in L<"Arithmetic operations"> about
361assignment-variants and autogeneration apply for
362bit operations C<"&">, C<"^">, and C<"|"> as well.
363
4633a7c4 364=item * I<Increment and decrement>
365
366 "++", "--",
367
368If undefined, addition and subtraction methods can be
369used instead. These operations are called both in prefix and
370postfix form.
371
372=item * I<Transcendental functions>
373
f216259d 374 "atan2", "cos", "sin", "exp", "abs", "log", "sqrt", "int"
4633a7c4 375
376If C<abs> is unavailable, it can be autogenerated using methods
1fef88e7 377for "E<lt>" or "E<lt>=E<gt>" combined with either unary minus or subtraction.
4633a7c4 378
f216259d 379Note that traditionally the Perl function L<int> rounds to 0, thus for
380floating-point-like types one should follow the same semantic. If
381C<int> is unavailable, it can be autogenerated using the overloading of
382C<0+>.
383
4633a7c4 384=item * I<Boolean, string and numeric conversion>
385
fa8a6580 386 'bool', '""', '0+',
4633a7c4 387
f5284f61 388If one or two of these operations are not overloaded, the remaining ones can
4633a7c4 389be used instead. C<bool> is used in the flow control operators
fa8a6580 390(like C<while>) and for the ternary C<?:> operation. These functions can
4633a7c4 391return any arbitrary Perl value. If the corresponding operation for this value
392is overloaded too, that operation will be called again with this value.
393
1554e226 394As a special case if the overload returns the object itself then it will
395be used directly. An overloaded conversion returning the object is
396probably a bug, because you're likely to get something that looks like
397C<YourPackage=HASH(0x8172b34)>.
398
f5284f61 399=item * I<Iteration>
400
401 "<>"
402
403If not overloaded, the argument will be converted to a filehandle or
404glob (which may require a stringification). The same overloading
405happens both for the I<read-filehandle> syntax C<E<lt>$varE<gt>> and
406I<globbing> syntax C<E<lt>${var}E<gt>>.
407
54f8c773 408B<BUGS> Even in list context, the iterator is currently called only
409once and with scalar context.
410
f5284f61 411=item * I<Dereferencing>
412
413 '${}', '@{}', '%{}', '&{}', '*{}'.
414
415If not overloaded, the argument will be dereferenced I<as is>, thus
416should be of correct type. These functions should return a reference
417of correct type, or another object with overloaded dereferencing.
418
b267980d 419As a special case if the overload returns the object itself then it
420will be used directly (provided it is the correct type).
421
422The dereference operators must be specified explicitly they will not be passed to
423"nomethod".
424
4633a7c4 425=item * I<Special>
426
0d863452 427 "nomethod", "fallback", "=", "~~",
4633a7c4 428
429see L<SPECIAL SYMBOLS FOR C<use overload>>.
430
431=back
432
ee239bfe 433See L<"Fallback"> for an explanation of when a missing method can be
434autogenerated.
435
436A computer-readable form of the above table is available in the hash
437%overload::ops, with values being space-separated lists of names:
438
439 with_assign => '+ - * / % ** << >> x .',
440 assign => '+= -= *= /= %= **= <<= >>= x= .=',
2877bd81 441 num_comparison => '< <= > >= == !=',
ee239bfe 442 '3way_comparison'=> '<=> cmp',
2877bd81 443 str_comparison => 'lt le gt ge eq ne',
6dd85743 444 binary => '& &= | |= ^ ^=',
ee239bfe 445 unary => 'neg ! ~',
446 mutators => '++ --',
447 func => 'atan2 cos sin exp abs log sqrt',
448 conversion => 'bool "" 0+',
f5284f61 449 iterators => '<>',
450 dereferencing => '${} @{} %{} &{} *{}',
ee239bfe 451 special => 'nomethod fallback ='
4633a7c4 452
e7ea3e70 453=head2 Inheritance and overloading
454
774d564b 455Inheritance interacts with overloading in two ways.
e7ea3e70 456
88c28ceb 457=over
e7ea3e70 458
459=item Strings as values of C<use overload> directive
460
774d564b 461If C<value> in
e7ea3e70 462
463 use overload key => value;
464
774d564b 465is a string, it is interpreted as a method name.
e7ea3e70 466
467=item Overloading of an operation is inherited by derived classes
468
774d564b 469Any class derived from an overloaded class is also overloaded. The
470set of overloaded methods is the union of overloaded methods of all
471the ancestors. If some method is overloaded in several ancestor, then
e7ea3e70 472which description will be used is decided by the usual inheritance
774d564b 473rules:
e7ea3e70 474
774d564b 475If C<A> inherits from C<B> and C<C> (in this order), C<B> overloads
476C<+> with C<\&D::plus_sub>, and C<C> overloads C<+> by C<"plus_meth">,
477then the subroutine C<D::plus_sub> will be called to implement
478operation C<+> for an object in package C<A>.
e7ea3e70 479
480=back
481
774d564b 482Note that since the value of the C<fallback> key is not a subroutine,
483its inheritance is not governed by the above rules. In the current
484implementation, the value of C<fallback> in the first overloaded
485ancestor is used, but this is accidental and subject to change.
e7ea3e70 486
4633a7c4 487=head1 SPECIAL SYMBOLS FOR C<use overload>
488
489Three keys are recognized by Perl that are not covered by the above
490description.
491
774d564b 492=head2 Last Resort
4633a7c4 493
494C<"nomethod"> should be followed by a reference to a function of four
495parameters. If defined, it is called when the overloading mechanism
496cannot find a method for some operation. The first three arguments of
497this function coincide with the arguments for the corresponding method if
498it were found, the fourth argument is the symbol
499corresponding to the missing method. If several methods are tried,
500the last one is used. Say, C<1-$a> can be equivalent to
501
502 &nomethodMethod($a,1,1,"-")
503
504if the pair C<"nomethod" =E<gt> "nomethodMethod"> was specified in the
505C<use overload> directive.
506
b267980d 507The C<"nomethod"> mechanism is I<not> used for the dereference operators
508( ${} @{} %{} &{} *{} ).
509
510
4633a7c4 511If some operation cannot be resolved, and there is no function
512assigned to C<"nomethod">, then an exception will be raised via die()--
513unless C<"fallback"> was specified as a key in C<use overload> directive.
514
b267980d 515
516=head2 Fallback
4633a7c4 517
518The key C<"fallback"> governs what to do if a method for a particular
519operation is not found. Three different cases are possible depending on
520the value of C<"fallback">:
521
522=over 16
523
524=item * C<undef>
525
526Perl tries to use a
527substituted method (see L<MAGIC AUTOGENERATION>). If this fails, it
528then tries to calls C<"nomethod"> value; if missing, an exception
529will be raised.
530
531=item * TRUE
532
533The same as for the C<undef> value, but no exception is raised. Instead,
534it silently reverts to what it would have done were there no C<use overload>
535present.
536
537=item * defined, but FALSE
538
539No autogeneration is tried. Perl tries to call
b267980d 540C<"nomethod"> value, and if this is missing, raises an exception.
4633a7c4 541
542=back
543
e7ea3e70 544B<Note.> C<"fallback"> inheritance via @ISA is not carved in stone
545yet, see L<"Inheritance and overloading">.
546
5e68dedd 547=head2 Smart Match
548
549The key C<"~~"> allows you to override the smart matching used by
550the switch construct. See L<feature>.
551
4633a7c4 552=head2 Copy Constructor
553
554The value for C<"="> is a reference to a function with three
555arguments, i.e., it looks like the other values in C<use
556overload>. However, it does not overload the Perl assignment
557operator. This would go against Camel hair.
558
559This operation is called in the situations when a mutator is applied
560to a reference that shares its object with some other reference, such
561as
562
b267980d 563 $a=$b;
ee239bfe 564 ++$a;
4633a7c4 565
566To make this change $a and not change $b, a copy of C<$$a> is made,
567and $a is assigned a reference to this new object. This operation is
ee239bfe 568done during execution of the C<++$a>, and not during the assignment,
4633a7c4 569(so before the increment C<$$a> coincides with C<$$b>). This is only
ee239bfe 570done if C<++> is expressed via a method for C<'++'> or C<'+='> (or
571C<nomethod>). Note that if this operation is expressed via C<'+'>
572a nonmutator, i.e., as in
4633a7c4 573
b267980d 574 $a=$b;
4633a7c4 575 $a=$a+1;
576
577then C<$a> does not reference a new copy of C<$$a>, since $$a does not
578appear as lvalue when the above code is executed.
579
580If the copy constructor is required during the execution of some mutator,
581but a method for C<'='> was not specified, it can be autogenerated as a
582string copy if the object is a plain scalar.
583
584=over 5
585
586=item B<Example>
587
b267980d 588The actually executed code for
4633a7c4 589
b267980d 590 $a=$b;
4633a7c4 591 Something else which does not modify $a or $b....
592 ++$a;
593
594may be
595
b267980d 596 $a=$b;
4633a7c4 597 Something else which does not modify $a or $b....
598 $a = $a->clone(undef,"");
599 $a->incr(undef,"");
600
601if $b was mathemagical, and C<'++'> was overloaded with C<\&incr>,
602C<'='> was overloaded with C<\&clone>.
603
604=back
605
f610777f 606Same behaviour is triggered by C<$b = $a++>, which is consider a synonym for
ee239bfe 607C<$b = $a; ++$a>.
608
4633a7c4 609=head1 MAGIC AUTOGENERATION
610
611If a method for an operation is not found, and the value for C<"fallback"> is
612TRUE or undefined, Perl tries to autogenerate a substitute method for
613the missing operation based on the defined operations. Autogenerated method
614substitutions are possible for the following operations:
615
616=over 16
617
618=item I<Assignment forms of arithmetic operations>
619
620C<$a+=$b> can use the method for C<"+"> if the method for C<"+=">
621is not defined.
622
b267980d 623=item I<Conversion operations>
4633a7c4 624
625String, numeric, and boolean conversion are calculated in terms of one
626another if not all of them are defined.
627
628=item I<Increment and decrement>
629
630The C<++$a> operation can be expressed in terms of C<$a+=1> or C<$a+1>,
631and C<$a--> in terms of C<$a-=1> and C<$a-1>.
632
633=item C<abs($a)>
634
635can be expressed in terms of C<$aE<lt>0> and C<-$a> (or C<0-$a>).
636
637=item I<Unary minus>
638
639can be expressed in terms of subtraction.
640
3bc6ec80 641=item I<Negation>
642
643C<!> and C<not> can be expressed in terms of boolean conversion, or
644string or numerical conversion.
645
4633a7c4 646=item I<Concatenation>
647
648can be expressed in terms of string conversion.
649
b267980d 650=item I<Comparison operations>
4633a7c4 651
652can be expressed in terms of its "spaceship" counterpart: either
653C<E<lt>=E<gt>> or C<cmp>:
1fef88e7 654
4633a7c4 655 <, >, <=, >=, ==, != in terms of <=>
656 lt, gt, le, ge, eq, ne in terms of cmp
657
f5284f61 658=item I<Iterator>
659
660 <> in terms of builtin operations
661
662=item I<Dereferencing>
663
664 ${} @{} %{} &{} *{} in terms of builtin operations
665
4633a7c4 666=item I<Copy operator>
667
668can be expressed in terms of an assignment to the dereferenced value, if this
669value is a scalar and not a reference.
670
671=back
672
84fc275b 673=head1 Minimal set of overloaded operations
674
675Since some operations can be automatically generated from others, there is
676a minimal set of operations that need to be overloaded in order to have
299476e0 677the complete set of overloaded operations at one's disposal.
678Of course, the autogenerated operations may not do exactly what the user
679expects. See L<MAGIC AUTOGENERATION> above. The minimal set is:
84fc275b 680
681 + - * / % ** << >> x
682 <=> cmp
683 & | ^ ~
684 atan2 cos sin exp log sqrt int
685
686Additionally, you need to define at least one of string, boolean or
299476e0 687numeric conversions because any one can be used to emulate the others.
688The string conversion can also be used to emulate concatenation.
84fc275b 689
ee239bfe 690=head1 Losing overloading
4633a7c4 691
692The restriction for the comparison operation is that even if, for example,
693`C<cmp>' should return a blessed reference, the autogenerated `C<lt>'
694function will produce only a standard logical value based on the
695numerical value of the result of `C<cmp>'. In particular, a working
696numeric conversion is needed in this case (possibly expressed in terms of
697other conversions).
698
699Similarly, C<.=> and C<x=> operators lose their mathemagical properties
700if the string conversion substitution is applied.
701
702When you chop() a mathemagical object it is promoted to a string and its
703mathemagical properties are lost. The same can happen with other
704operations as well.
705
706=head1 Run-time Overloading
707
708Since all C<use> directives are executed at compile-time, the only way to
709change overloading during run-time is to
710
711 eval 'use overload "+" => \&addmethod';
712
713You can also use
714
715 eval 'no overload "+", "--", "<="';
716
717though the use of these constructs during run-time is questionable.
718
719=head1 Public functions
720
721Package C<overload.pm> provides the following public functions:
722
723=over 5
724
725=item overload::StrVal(arg)
726
6a0e9e72 727Gives string value of C<arg> as in absence of stringify overloading. If you
728are using this to get the address of a reference (useful for checking if two
729references point to the same thing) then you may be better off using
730C<Scalar::Util::refaddr()>, which is faster.
4633a7c4 731
732=item overload::Overloaded(arg)
733
734Returns true if C<arg> is subject to overloading of some operations.
735
736=item overload::Method(obj,op)
737
738Returns C<undef> or a reference to the method that implements C<op>.
739
740=back
741
b3ac6de7 742=head1 Overloading constants
743
7adf7a02 744For some applications, the Perl parser mangles constants too much.
bfce84ec 745It is possible to hook into this process via C<overload::constant()>
7adf7a02 746and C<overload::remove_constant()> functions.
b3ac6de7 747
748These functions take a hash as an argument. The recognized keys of this hash
7adf7a02 749are:
b3ac6de7 750
751=over 8
752
753=item integer
754
755to overload integer constants,
756
757=item float
758
759to overload floating point constants,
760
761=item binary
762
763to overload octal and hexadecimal constants,
764
765=item q
766
767to overload C<q>-quoted strings, constant pieces of C<qq>- and C<qx>-quoted
768strings and here-documents,
769
770=item qr
771
772to overload constant pieces of regular expressions.
773
774=back
775
776The corresponding values are references to functions which take three arguments:
777the first one is the I<initial> string form of the constant, the second one
b267980d 778is how Perl interprets this constant, the third one is how the constant is used.
b3ac6de7 779Note that the initial string form does not
b267980d 780contain string delimiters, and has backslashes in backslash-delimiter
b3ac6de7 781combinations stripped (thus the value of delimiter is not relevant for
b267980d 782processing of this string). The return value of this function is how this
b3ac6de7 783constant is going to be interpreted by Perl. The third argument is undefined
784unless for overloaded C<q>- and C<qr>- constants, it is C<q> in single-quote
785context (comes from strings, regular expressions, and single-quote HERE
b267980d 786documents), it is C<tr> for arguments of C<tr>/C<y> operators,
b3ac6de7 787it is C<s> for right-hand side of C<s>-operator, and it is C<qq> otherwise.
788
789Since an expression C<"ab$cd,,"> is just a shortcut for C<'ab' . $cd . ',,'>,
790it is expected that overloaded constant strings are equipped with reasonable
b267980d 791overloaded catenation operator, otherwise absurd results will result.
b3ac6de7 792Similarly, negative numbers are considered as negations of positive constants.
793
794Note that it is probably meaningless to call the functions overload::constant()
795and overload::remove_constant() from anywhere but import() and unimport() methods.
796From these methods they may be called as
797
798 sub import {
799 shift;
800 return unless @_;
801 die "unknown import: @_" unless @_ == 1 and $_[0] eq ':constant';
802 overload::constant integer => sub {Math::BigInt->new(shift)};
803 }
804
4633a7c4 805=head1 IMPLEMENTATION
806
807What follows is subject to change RSN.
808
e7ea3e70 809The table of methods for all operations is cached in magic for the
810symbol table hash for the package. The cache is invalidated during
811processing of C<use overload>, C<no overload>, new function
812definitions, and changes in @ISA. However, this invalidation remains
813unprocessed until the next C<bless>ing into the package. Hence if you
814want to change overloading structure dynamically, you'll need an
815additional (fake) C<bless>ing to update the table.
816
817(Every SVish thing has a magic queue, and magic is an entry in that
818queue. This is how a single variable may participate in multiple
819forms of magic simultaneously. For instance, environment variables
820regularly have two forms at once: their %ENV magic and their taint
821magic. However, the magic which implements overloading is applied to
822the stashes, which are rarely used directly, thus should not slow down
823Perl.)
4633a7c4 824
825If an object belongs to a package using overload, it carries a special
826flag. Thus the only speed penalty during arithmetic operations without
827overloading is the checking of this flag.
828
774d564b 829In fact, if C<use overload> is not present, there is almost no overhead
830for overloadable operations, so most programs should not suffer
831measurable performance penalties. A considerable effort was made to
832minimize the overhead when overload is used in some package, but the
833arguments in question do not belong to packages using overload. When
834in doubt, test your speed with C<use overload> and without it. So far
835there have been no reports of substantial speed degradation if Perl is
836compiled with optimization turned on.
4633a7c4 837
e7ea3e70 838There is no size penalty for data if overload is not used. The only
839size penalty if overload is used in some package is that I<all> the
840packages acquire a magic during the next C<bless>ing into the
841package. This magic is three-words-long for packages without
f610777f 842overloading, and carries the cache table if the package is overloaded.
4633a7c4 843
b267980d 844Copying (C<$a=$b>) is shallow; however, a one-level-deep copying is
4633a7c4 845carried out before any operation that can imply an assignment to the
846object $a (or $b) refers to, like C<$a++>. You can override this
847behavior by defining your own copy constructor (see L<"Copy Constructor">).
848
849It is expected that arguments to methods that are not explicitly supposed
850to be changed are constant (but this is not enforced).
851
ee239bfe 852=head1 Metaphor clash
853
f610777f 854One may wonder why the semantic of overloaded C<=> is so counter intuitive.
b267980d 855If it I<looks> counter intuitive to you, you are subject to a metaphor
856clash.
ee239bfe 857
858Here is a Perl object metaphor:
859
860I< object is a reference to blessed data>
861
862and an arithmetic metaphor:
863
864I< object is a thing by itself>.
865
866The I<main> problem of overloading C<=> is the fact that these metaphors
867imply different actions on the assignment C<$a = $b> if $a and $b are
868objects. Perl-think implies that $a becomes a reference to whatever
869$b was referencing. Arithmetic-think implies that the value of "object"
870$a is changed to become the value of the object $b, preserving the fact
871that $a and $b are separate entities.
872
873The difference is not relevant in the absence of mutators. After
874a Perl-way assignment an operation which mutates the data referenced by $a
b267980d 875would change the data referenced by $b too. Effectively, after
ee239bfe 876C<$a = $b> values of $a and $b become I<indistinguishable>.
877
b267980d 878On the other hand, anyone who has used algebraic notation knows the
ee239bfe 879expressive power of the arithmetic metaphor. Overloading works hard
880to enable this metaphor while preserving the Perlian way as far as
d1be9408 881possible. Since it is not possible to freely mix two contradicting
ee239bfe 882metaphors, overloading allows the arithmetic way to write things I<as
883far as all the mutators are called via overloaded access only>. The
884way it is done is described in L<Copy Constructor>.
885
886If some mutator methods are directly applied to the overloaded values,
b267980d 887one may need to I<explicitly unlink> other values which references the
ee239bfe 888same value:
889
890 $a = new Data 23;
891 ...
892 $b = $a; # $b is "linked" to $a
893 ...
894 $a = $a->clone; # Unlink $b from $a
895 $a->increment_by(4);
896
897Note that overloaded access makes this transparent:
898
899 $a = new Data 23;
900 $b = $a; # $b is "linked" to $a
901 $a += 4; # would unlink $b automagically
902
903However, it would not make
904
905 $a = new Data 23;
906 $a = 4; # Now $a is a plain 4, not 'Data'
907
908preserve "objectness" of $a. But Perl I<has> a way to make assignments
909to an object do whatever you want. It is just not the overload, but
910tie()ing interface (see L<perlfunc/tie>). Adding a FETCH() method
b267980d 911which returns the object itself, and STORE() method which changes the
ee239bfe 912value of the object, one can reproduce the arithmetic metaphor in its
913completeness, at least for variables which were tie()d from the start.
914
915(Note that a workaround for a bug may be needed, see L<"BUGS">.)
916
917=head1 Cookbook
918
919Please add examples to what follows!
920
921=head2 Two-face scalars
922
923Put this in F<two_face.pm> in your Perl library directory:
924
925 package two_face; # Scalars with separate string and
926 # numeric values.
927 sub new { my $p = shift; bless [@_], $p }
928 use overload '""' => \&str, '0+' => \&num, fallback => 1;
929 sub num {shift->[1]}
930 sub str {shift->[0]}
931
932Use it as follows:
933
934 require two_face;
935 my $seven = new two_face ("vii", 7);
936 printf "seven=$seven, seven=%d, eight=%d\n", $seven, $seven+1;
937 print "seven contains `i'\n" if $seven =~ /i/;
938
939(The second line creates a scalar which has both a string value, and a
940numeric value.) This prints:
941
942 seven=vii, seven=7, eight=8
943 seven contains `i'
944
f5284f61 945=head2 Two-face references
946
947Suppose you want to create an object which is accessible as both an
6d822dc4 948array reference and a hash reference.
f5284f61 949
950 package two_refs;
951 use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} };
b267980d 952 sub new {
953 my $p = shift;
f5284f61 954 bless \ [@_], $p;
955 }
956 sub gethash {
957 my %h;
958 my $self = shift;
959 tie %h, ref $self, $self;
960 \%h;
961 }
962
963 sub TIEHASH { my $p = shift; bless \ shift, $p }
964 my %fields;
965 my $i = 0;
966 $fields{$_} = $i++ foreach qw{zero one two three};
b267980d 967 sub STORE {
f5284f61 968 my $self = ${shift()};
969 my $key = $fields{shift()};
970 defined $key or die "Out of band access";
971 $$self->[$key] = shift;
972 }
b267980d 973 sub FETCH {
f5284f61 974 my $self = ${shift()};
975 my $key = $fields{shift()};
976 defined $key or die "Out of band access";
977 $$self->[$key];
978 }
979
980Now one can access an object using both the array and hash syntax:
981
982 my $bar = new two_refs 3,4,5,6;
983 $bar->[2] = 11;
984 $bar->{two} == 11 or die 'bad hash fetch';
985
986Note several important features of this example. First of all, the
987I<actual> type of $bar is a scalar reference, and we do not overload
988the scalar dereference. Thus we can get the I<actual> non-overloaded
989contents of $bar by just using C<$$bar> (what we do in functions which
990overload dereference). Similarly, the object returned by the
991TIEHASH() method is a scalar reference.
992
993Second, we create a new tied hash each time the hash syntax is used.
994This allows us not to worry about a possibility of a reference loop,
d1be9408 995which would lead to a memory leak.
f5284f61 996
997Both these problems can be cured. Say, if we want to overload hash
998dereference on a reference to an object which is I<implemented> as a
999hash itself, the only problem one has to circumvent is how to access
1fd16925 1000this I<actual> hash (as opposed to the I<virtual> hash exhibited by the
f5284f61 1001overloaded dereference operator). Here is one possible fetching routine:
1002
1003 sub access_hash {
1004 my ($self, $key) = (shift, shift);
1005 my $class = ref $self;
b267980d 1006 bless $self, 'overload::dummy'; # Disable overloading of %{}
f5284f61 1007 my $out = $self->{$key};
1008 bless $self, $class; # Restore overloading
1009 $out;
1010 }
1011
1fd16925 1012To remove creation of the tied hash on each access, one may an extra
f5284f61 1013level of indirection which allows a non-circular structure of references:
1014
1015 package two_refs1;
1016 use overload '%{}' => sub { ${shift()}->[1] },
1017 '@{}' => sub { ${shift()}->[0] };
b267980d 1018 sub new {
1019 my $p = shift;
f5284f61 1020 my $a = [@_];
1021 my %h;
1022 tie %h, $p, $a;
1023 bless \ [$a, \%h], $p;
1024 }
1025 sub gethash {
1026 my %h;
1027 my $self = shift;
1028 tie %h, ref $self, $self;
1029 \%h;
1030 }
1031
1032 sub TIEHASH { my $p = shift; bless \ shift, $p }
1033 my %fields;
1034 my $i = 0;
1035 $fields{$_} = $i++ foreach qw{zero one two three};
b267980d 1036 sub STORE {
f5284f61 1037 my $a = ${shift()};
1038 my $key = $fields{shift()};
1039 defined $key or die "Out of band access";
1040 $a->[$key] = shift;
1041 }
b267980d 1042 sub FETCH {
f5284f61 1043 my $a = ${shift()};
1044 my $key = $fields{shift()};
1045 defined $key or die "Out of band access";
1046 $a->[$key];
1047 }
1048
1fd16925 1049Now if $baz is overloaded like this, then C<$baz> is a reference to a
f5284f61 1050reference to the intermediate array, which keeps a reference to an
1051actual array, and the access hash. The tie()ing object for the access
1fd16925 1052hash is a reference to a reference to the actual array, so
f5284f61 1053
88c28ceb 1054=over
f5284f61 1055
1056=item *
1057
1058There are no loops of references.
1059
1060=item *
1061
1062Both "objects" which are blessed into the class C<two_refs1> are
1063references to a reference to an array, thus references to a I<scalar>.
1064Thus the accessor expression C<$$foo-E<gt>[$ind]> involves no
1065overloaded operations.
1066
1067=back
1068
ee239bfe 1069=head2 Symbolic calculator
1070
1071Put this in F<symbolic.pm> in your Perl library directory:
1072
1073 package symbolic; # Primitive symbolic calculator
1074 use overload nomethod => \&wrap;
1075
1076 sub new { shift; bless ['n', @_] }
1077 sub wrap {
1078 my ($obj, $other, $inv, $meth) = @_;
1079 ($obj, $other) = ($other, $obj) if $inv;
1080 bless [$meth, $obj, $other];
1081 }
1082
1083This module is very unusual as overloaded modules go: it does not
88c28ceb 1084provide any usual overloaded operators, instead it provides the L<Last
1085Resort> operator C<nomethod>. In this example the corresponding
f610777f 1086subroutine returns an object which encapsulates operations done over
ee239bfe 1087the objects: C<new symbolic 3> contains C<['n', 3]>, C<2 + new
1088symbolic 3> contains C<['+', 2, ['n', 3]]>.
1089
1090Here is an example of the script which "calculates" the side of
1091circumscribed octagon using the above package:
1092
1093 require symbolic;
1094 my $iter = 1; # 2**($iter+2) = 8
1095 my $side = new symbolic 1;
1096 my $cnt = $iter;
3cb6de81 1097
ee239bfe 1098 while ($cnt--) {
1099 $side = (sqrt(1 + $side**2) - 1)/$side;
1100 }
1101 print "OK\n";
1102
1103The value of $side is
1104
1105 ['/', ['-', ['sqrt', ['+', 1, ['**', ['n', 1], 2]],
1106 undef], 1], ['n', 1]]
1107
1108Note that while we obtained this value using a nice little script,
1109there is no simple way to I<use> this value. In fact this value may
2d3232d7 1110be inspected in debugger (see L<perldebug>), but only if
ee239bfe 1111C<bareStringify> B<O>ption is set, and not via C<p> command.
1112
1113If one attempts to print this value, then the overloaded operator
1114C<""> will be called, which will call C<nomethod> operator. The
1115result of this operator will be stringified again, but this result is
1116again of type C<symbolic>, which will lead to an infinite loop.
1117
1118Add a pretty-printer method to the module F<symbolic.pm>:
1119
1120 sub pretty {
1121 my ($meth, $a, $b) = @{+shift};
1122 $a = 'u' unless defined $a;
1123 $b = 'u' unless defined $b;
1124 $a = $a->pretty if ref $a;
1125 $b = $b->pretty if ref $b;
1126 "[$meth $a $b]";
b267980d 1127 }
ee239bfe 1128
1129Now one can finish the script by
1130
1131 print "side = ", $side->pretty, "\n";
1132
1133The method C<pretty> is doing object-to-string conversion, so it
1134is natural to overload the operator C<""> using this method. However,
1135inside such a method it is not necessary to pretty-print the
1136I<components> $a and $b of an object. In the above subroutine
1137C<"[$meth $a $b]"> is a catenation of some strings and components $a
1138and $b. If these components use overloading, the catenation operator
1fd16925 1139will look for an overloaded operator C<.>; if not present, it will
ee239bfe 1140look for an overloaded operator C<"">. Thus it is enough to use
1141
1142 use overload nomethod => \&wrap, '""' => \&str;
1143 sub str {
1144 my ($meth, $a, $b) = @{+shift};
1145 $a = 'u' unless defined $a;
1146 $b = 'u' unless defined $b;
1147 "[$meth $a $b]";
b267980d 1148 }
ee239bfe 1149
1150Now one can change the last line of the script to
1151
1152 print "side = $side\n";
1153
1154which outputs
1155
1156 side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]]
1157
1158and one can inspect the value in debugger using all the possible
b267980d 1159methods.
ee239bfe 1160
d1be9408 1161Something is still amiss: consider the loop variable $cnt of the
ee239bfe 1162script. It was a number, not an object. We cannot make this value of
1163type C<symbolic>, since then the loop will not terminate.
1164
1165Indeed, to terminate the cycle, the $cnt should become false.
1166However, the operator C<bool> for checking falsity is overloaded (this
1167time via overloaded C<"">), and returns a long string, thus any object
1168of type C<symbolic> is true. To overcome this, we need a way to
1169compare an object to 0. In fact, it is easier to write a numeric
1170conversion routine.
1171
1172Here is the text of F<symbolic.pm> with such a routine added (and
f610777f 1173slightly modified str()):
ee239bfe 1174
1175 package symbolic; # Primitive symbolic calculator
1176 use overload
1177 nomethod => \&wrap, '""' => \&str, '0+' => \&num;
1178
1179 sub new { shift; bless ['n', @_] }
1180 sub wrap {
1181 my ($obj, $other, $inv, $meth) = @_;
1182 ($obj, $other) = ($other, $obj) if $inv;
1183 bless [$meth, $obj, $other];
1184 }
1185 sub str {
1186 my ($meth, $a, $b) = @{+shift};
1187 $a = 'u' unless defined $a;
1188 if (defined $b) {
1189 "[$meth $a $b]";
1190 } else {
1191 "[$meth $a]";
1192 }
b267980d 1193 }
1194 my %subr = ( n => sub {$_[0]},
1195 sqrt => sub {sqrt $_[0]},
ee239bfe 1196 '-' => sub {shift() - shift()},
1197 '+' => sub {shift() + shift()},
1198 '/' => sub {shift() / shift()},
1199 '*' => sub {shift() * shift()},
1200 '**' => sub {shift() ** shift()},
1201 );
1202 sub num {
1203 my ($meth, $a, $b) = @{+shift};
b267980d 1204 my $subr = $subr{$meth}
ee239bfe 1205 or die "Do not know how to ($meth) in symbolic";
1206 $a = $a->num if ref $a eq __PACKAGE__;
1207 $b = $b->num if ref $b eq __PACKAGE__;
1208 $subr->($a,$b);
1209 }
1210
1211All the work of numeric conversion is done in %subr and num(). Of
f610777f 1212course, %subr is not complete, it contains only operators used in the
ee239bfe 1213example below. Here is the extra-credit question: why do we need an
1214explicit recursion in num()? (Answer is at the end of this section.)
1215
1216Use this module like this:
1217
1218 require symbolic;
1219 my $iter = new symbolic 2; # 16-gon
1220 my $side = new symbolic 1;
1221 my $cnt = $iter;
3cb6de81 1222
ee239bfe 1223 while ($cnt) {
1224 $cnt = $cnt - 1; # Mutator `--' not implemented
1225 $side = (sqrt(1 + $side**2) - 1)/$side;
1226 }
1227 printf "%s=%f\n", $side, $side;
1228 printf "pi=%f\n", $side*(2**($iter+2));
1229
1230It prints (without so many line breaks)
1231
1232 [/ [- [sqrt [+ 1 [** [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1]
1233 [n 1]] 2]]] 1]
1234 [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] [n 1]]]=0.198912
1235 pi=3.182598
1236
1237The above module is very primitive. It does not implement
1238mutator methods (C<++>, C<-=> and so on), does not do deep copying
1239(not required without mutators!), and implements only those arithmetic
1240operations which are used in the example.
1241
1fd16925 1242To implement most arithmetic operations is easy; one should just use
ee239bfe 1243the tables of operations, and change the code which fills %subr to
1244
1245 my %subr = ( 'n' => sub {$_[0]} );
1246 foreach my $op (split " ", $overload::ops{with_assign}) {
1247 $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
1248 }
1249 my @bins = qw(binary 3way_comparison num_comparison str_comparison);
1250 foreach my $op (split " ", "@overload::ops{ @bins }") {
1251 $subr{$op} = eval "sub {shift() $op shift()}";
1252 }
1253 foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
1254 print "defining `$op'\n";
1255 $subr{$op} = eval "sub {$op shift()}";
1256 }
1257
1258Due to L<Calling Conventions for Mutators>, we do not need anything
1259special to make C<+=> and friends work, except filling C<+=> entry of
1260%subr, and defining a copy constructor (needed since Perl has no
1261way to know that the implementation of C<'+='> does not mutate
1262the argument, compare L<Copy Constructor>).
1263
1fd16925 1264To implement a copy constructor, add C<< '=' => \&cpy >> to C<use overload>
ee239bfe 1265line, and code (this code assumes that mutators change things one level
1266deep only, so recursive copying is not needed):
1267
1268 sub cpy {
1269 my $self = shift;
1270 bless [@$self], ref $self;
1271 }
1272
b267980d 1273To make C<++> and C<--> work, we need to implement actual mutators,
ee239bfe 1274either directly, or in C<nomethod>. We continue to do things inside
1275C<nomethod>, thus add
1276
1277 if ($meth eq '++' or $meth eq '--') {
1278 @$obj = ($meth, (bless [@$obj]), 1); # Avoid circular reference
1279 return $obj;
1280 }
1281
b267980d 1282after the first line of wrap(). This is not a most effective
ee239bfe 1283implementation, one may consider
1284
1285 sub inc { $_[0] = bless ['++', shift, 1]; }
1286
1287instead.
1288
1289As a final remark, note that one can fill %subr by
1290
1291 my %subr = ( 'n' => sub {$_[0]} );
1292 foreach my $op (split " ", $overload::ops{with_assign}) {
1293 $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
1294 }
1295 my @bins = qw(binary 3way_comparison num_comparison str_comparison);
1296 foreach my $op (split " ", "@overload::ops{ @bins }") {
1297 $subr{$op} = eval "sub {shift() $op shift()}";
1298 }
1299 foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
1300 $subr{$op} = eval "sub {$op shift()}";
1301 }
1302 $subr{'++'} = $subr{'+'};
1303 $subr{'--'} = $subr{'-'};
1304
b267980d 1305This finishes implementation of a primitive symbolic calculator in
130650 lines of Perl code. Since the numeric values of subexpressions
ee239bfe 1307are not cached, the calculator is very slow.
1308
1309Here is the answer for the exercise: In the case of str(), we need no
1310explicit recursion since the overloaded C<.>-operator will fall back
1311to an existing overloaded operator C<"">. Overloaded arithmetic
1312operators I<do not> fall back to numeric conversion if C<fallback> is
1313not explicitly requested. Thus without an explicit recursion num()
1314would convert C<['+', $a, $b]> to C<$a + $b>, which would just rebuild
1315the argument of num().
1316
1317If you wonder why defaults for conversion are different for str() and
1318num(), note how easy it was to write the symbolic calculator. This
1319simplicity is due to an appropriate choice of defaults. One extra
f610777f 1320note: due to the explicit recursion num() is more fragile than sym():
1321we need to explicitly check for the type of $a and $b. If components
ee239bfe 1322$a and $b happen to be of some related type, this may lead to problems.
1323
1324=head2 I<Really> symbolic calculator
1325
1326One may wonder why we call the above calculator symbolic. The reason
1327is that the actual calculation of the value of expression is postponed
1328until the value is I<used>.
1329
1330To see it in action, add a method
1331
b267980d 1332 sub STORE {
1333 my $obj = shift;
1334 $#$obj = 1;
ee239bfe 1335 @$obj->[0,1] = ('=', shift);
1336 }
1337
1338to the package C<symbolic>. After this change one can do
1339
1340 my $a = new symbolic 3;
1341 my $b = new symbolic 4;
1342 my $c = sqrt($a**2 + $b**2);
1343
1344and the numeric value of $c becomes 5. However, after calling
1345
1346 $a->STORE(12); $b->STORE(5);
1347
1348the numeric value of $c becomes 13. There is no doubt now that the module
1349symbolic provides a I<symbolic> calculator indeed.
1350
1351To hide the rough edges under the hood, provide a tie()d interface to the
1352package C<symbolic> (compare with L<Metaphor clash>). Add methods
1353
1354 sub TIESCALAR { my $pack = shift; $pack->new(@_) }
1355 sub FETCH { shift }
1356 sub nop { } # Around a bug
1357
1358(the bug is described in L<"BUGS">). One can use this new interface as
1359
1360 tie $a, 'symbolic', 3;
1361 tie $b, 'symbolic', 4;
1362 $a->nop; $b->nop; # Around a bug
1363
1364 my $c = sqrt($a**2 + $b**2);
1365
1366Now numeric value of $c is 5. After C<$a = 12; $b = 5> the numeric value
1367of $c becomes 13. To insulate the user of the module add a method
1368
1369 sub vars { my $p = shift; tie($_, $p), $_->nop foreach @_; }
1370
1371Now
1372
1373 my ($a, $b);
1374 symbolic->vars($a, $b);
1375 my $c = sqrt($a**2 + $b**2);
1376
1377 $a = 3; $b = 4;
1378 printf "c5 %s=%f\n", $c, $c;
1379
1380 $a = 12; $b = 5;
1381 printf "c13 %s=%f\n", $c, $c;
1382
1383shows that the numeric value of $c follows changes to the values of $a
1384and $b.
1385
4633a7c4 1386=head1 AUTHOR
1387
1fef88e7 1388Ilya Zakharevich E<lt>F<ilya@math.mps.ohio-state.edu>E<gt>.
4633a7c4 1389
1390=head1 DIAGNOSTICS
1391
1392When Perl is run with the B<-Do> switch or its equivalent, overloading
1393induces diagnostic messages.
1394
e7ea3e70 1395Using the C<m> command of Perl debugger (see L<perldebug>) one can
1396deduce which operations are overloaded (and which ancestor triggers
1397this overloading). Say, if C<eq> is overloaded, then the method C<(eq>
1398is shown by debugger. The method C<()> corresponds to the C<fallback>
1399key (in fact a presence of this method shows that this package has
1400overloading enabled, and it is what is used by the C<Overloaded>
ee239bfe 1401function of module C<overload>).
e7ea3e70 1402
6ad11d81 1403The module might issue the following warnings:
6b82e2f5 1404
1405=over 4
1406
1407=item Odd number of arguments for overload::constant
1408
1409(W) The call to overload::constant contained an odd number of arguments.
1410The arguments should come in pairs.
1411
1412=item `%s' is not an overloadable type
1413
1414(W) You tried to overload a constant type the overload package is unaware of.
1415
1416=item `%s' is not a code reference
1417
1418(W) The second (fourth, sixth, ...) argument of overload::constant needs
1419to be a code reference. Either an anonymous subroutine, or a reference
1420to a subroutine.
1421
1422=back
1423
4633a7c4 1424=head1 BUGS
1425
aa689395 1426Because it is used for overloading, the per-package hash %OVERLOAD now
1427has a special meaning in Perl. The symbol table is filled with names
1428looking like line-noise.
4633a7c4 1429
a6006777 1430For the purpose of inheritance every overloaded package behaves as if
1431C<fallback> is present (possibly undefined). This may create
1432interesting effects if some package is not overloaded, but inherits
1433from two overloaded packages.
4633a7c4 1434
b267980d 1435Relation between overloading and tie()ing is broken. Overloading is
ee239bfe 1436triggered or not basing on the I<previous> class of tie()d value.
1437
b267980d 1438This happens because the presence of overloading is checked too early,
ee239bfe 1439before any tie()d access is attempted. If the FETCH()ed class of the
b267980d 1440tie()d value does not change, a simple workaround is to access the value
ee239bfe 1441immediately after tie()ing, so that after this call the I<previous> class
1442coincides with the current one.
1443
1444B<Needed:> a way to fix this without a speed penalty.
1445
b3ac6de7 1446Barewords are not covered by overloaded string constants.
1447
ee239bfe 1448This document is confusing. There are grammos and misleading language
1449used in places. It would seem a total rewrite is needed.
4633a7c4 1450
1451=cut
1452