fork download
  1. #!/usr/bin/perl
  2.  
  3. # Idiom #268 User-defined operator
  4. # https://p...content-available-to-author-only...s.org/idiom/268
  5.  
  6. use v5.10;
  7.  
  8. package Vector {
  9. sub new {
  10. my ($class, $x, $y, $z) = @_;
  11. bless [$x,$y,$z], $class;
  12. }
  13. sub x { shift->[0] };
  14. sub y { shift->[1] };
  15. sub z { shift->[2] };
  16.  
  17. use overload 'x' => sub { shift->xprod(shift) };
  18. use overload '""' => sub { shift->_stringify() };
  19.  
  20. sub xprod {
  21. my ($self,$v) = @_;
  22. return Vector->new(
  23. $self->y * $v->z - $self->z * $v->y,
  24. $self->z * $v->x - $self->x * $v->z,
  25. $self->x * $v->y - $self->y * $v->x,
  26. );
  27. }
  28.  
  29. sub _stringify {
  30. my $self = shift;
  31. return '(' . join(',',@{$self}) . ')'
  32. }
  33. }
  34.  
  35. my $a = Vector->new(3, 4, 5);
  36. my $b = Vector->new(5, 10, 1);
  37.  
  38. my $cross = $a x $b;
  39.  
  40. say "$a x $b = ", $cross;
Success #stdin #stdout 0.01s 5500KB
stdin
Standard input is empty
stdout
(3,4,5) x (5,10,1) = (-46,22,10)