#!/usr/bin/perl
# Idiom #268 User-defined operator
# https://p...content-available-to-author-only...s.org/idiom/268
use v5.10;
sub new {
my ($class, $x, $y, $z) = @_;
bless [$x,$y,$z], $class; }
sub x { shift->[0] };
sub z { shift->[2] };
use overload
'x' => sub { shift
->xprod(shift) }; use overload '""' => sub { shift->_stringify() };
sub xprod {
my ($self,$v) = @_;
$self->y * $v->z - $self->z * $v->y, $self->z * $v->x - $self->x * $v->z,
$self->x * $v->y - $self->y * $v->x, );
}
sub _stringify {
}
}
my $a = Vector->new(3, 4, 5);
my $b = Vector->new(5, 10, 1);
my $cross = $a x $b;
say "$a x $b = ", $cross;
IyEvdXNyL2Jpbi9wZXJsCgojIElkaW9tICMyNjggVXNlci1kZWZpbmVkIG9wZXJhdG9yCiMgaHR0cHM6Ly9wLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLm9yZy9pZGlvbS8yNjgKCnVzZSB2NS4xMDsKCnBhY2thZ2UgVmVjdG9yIHsKICAgIHN1YiBuZXcgewogICAgICAgIG15ICgkY2xhc3MsICR4LCAkeSwgJHopID0gQF87CiAgICAgICAgYmxlc3MgWyR4LCR5LCR6XSwgJGNsYXNzOwogICAgfQogICAgc3ViIHggeyBzaGlmdC0+WzBdIH07CiAgICBzdWIgeSB7IHNoaWZ0LT5bMV0gfTsKICAgIHN1YiB6IHsgc2hpZnQtPlsyXSB9OwogICAgCiAgICB1c2Ugb3ZlcmxvYWQgJ3gnICA9PiBzdWIgeyBzaGlmdC0+eHByb2Qoc2hpZnQpIH07CiAgICB1c2Ugb3ZlcmxvYWQgJyIiJyA9PiBzdWIgeyBzaGlmdC0+X3N0cmluZ2lmeSgpIH07CgogICAgc3ViIHhwcm9kIHsKICAgICAgICBteSAoJHNlbGYsJHYpID0gQF87CiAgICAgICAgcmV0dXJuIFZlY3Rvci0+bmV3KAogICAgICAgICAgICAkc2VsZi0+eSAqICR2LT56IC0gJHNlbGYtPnogKiAkdi0+eSwKICAgICAgICAgICAgJHNlbGYtPnogKiAkdi0+eCAtICRzZWxmLT54ICogJHYtPnosCiAgICAgICAgICAgICRzZWxmLT54ICogJHYtPnkgLSAkc2VsZi0+eSAqICR2LT54LAogICAgICAgICk7CiAgICB9CgogICAgc3ViIF9zdHJpbmdpZnkgeyAKICAgIAlteSAkc2VsZiA9IHNoaWZ0OyAKICAgIAlyZXR1cm4gJygnIC4gam9pbignLCcsQHskc2VsZn0pIC4gJyknIAogICAgfQp9CgpteSAkYSA9IFZlY3Rvci0+bmV3KDMsIDQsIDUpOwpteSAkYiA9IFZlY3Rvci0+bmV3KDUsIDEwLCAxKTsKCm15ICRjcm9zcyA9ICRhIHggJGI7CgpzYXkgIiRhIHggJGIgPSAiLCAkY3Jvc3M7