Manejadores de Operaciones no Commutativas

Es por esto que, para operaciones no conmutativas como la resta o la divisón, la función de implementación suele comenzar asi:

sub bsub {
  my ($op1, $op2, $reversed) = @_;
  ($op1, $op2) = ($op2, $op1) if $reversed;
  if (UNIVERSAL::isa($op1, 'Math::BigFloat') { 
    ... # $op1 es un objeto
  }
  ...
}
Veamos otro ejemplo, en el que el objeto esta a la derecha y a la izquierda tenemos una constante:
$ cat ./bigfloat3.pl
#!/usr/bin/perl -d
use strict;
use Math::BigFloat;

my $a = Math::BigFloat->new('123_456_789_123_456_789');

print "123_456_789_123_456_789-a = ",'123_456_789_123_456_789'-$a,"\n";
Al ejecutar, tenemos:
$ ./bigfloat3.pl
main::(./bigfloat3.pl:5):       my $a = Math::BigFloat->new('123_456_789_123_456_789');
  DB<1> n
main::(./bigfloat3.pl:7):       print "123_456_789_123_456_789-a = ",'123_456_789_123_456_789'-$a,"\n";
  DB<1> s
Math::BigInt::CODE(0x82f997c)(/usr/share/perl5/Math/BigInt.pm:47):
47:     '-'     =>      sub { my $c = $_[0]->copy; $_[2] ?
48:                        $c->bneg()->badd($_[1]) :
49:                        $c->bsub( $_[1]) },
  DB<1> p "@_"
123456789123456789 123_456_789_123_456_789 1
Vemos como el tercer argumento esta a 1 y como la subrutina anónima que trata el caso del menos binario convierte la expresión $a-$b en (-$b)+$a en el caso en que el objeto es el segundo término.

Continuamos la ejecución:

  DB<2> c
123_456_789_123_456_789-a = 0
Debugged program terminated.  Use q to quit or R to restart,
  use O inhibit_exit to avoid stopping after program termination,
  h q, h R or h O to get additional info.
Observe que, en general se espera que los operadores sobrecargados puedan manejar la operación de números y objetos de la clase como en 4+$a. Por tanto nuestro código debe manipular no solo la operación de objetos sino también la de objetos y números. El ejemplo anterior del método substract, a través del uso del método UNIVERSAL::isa (véase sección 6.6) muestra una forma de hacerlo.

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19