in reply to Re: how to export a method
in thread how to export a method

The PDL idiom was put together in the late 90s, and thanks to backward compatibility it will be difficult or impossible to change.

That idiom can be thought of as the various modules (PDL::Primitive, PDL::Ops) being roles, and they add "methods" to the PDL namespace. The answer to the question here, in order to operate like a typical PDL module, would both export a rp function, and implement a PDL::rp function that would add a PDL-object method. Because this is a function that only makes sense with an ndarray as its input, the natural thing would be to alias the exportable function to the PDL:: version:

package PDL::CV; use strict; use warnings; use Exporter 'import'; our @EXPORT_OK = qw(rp); *rp = \&PDL::rp; # alternative idiom, e.g. for zeroes: sub zeroes {PDL->zeroes(@_)} sub PDL::rp { my ($self, $input) = @_; $self .= $input->reshape($self->dims); $self; }
It is very important in this specific instance to note that reshape (as seen in PDL::Core#reshape) "changes the ndarray in place", i.e. is a mutation. PDL needs a new withdims affine transformation which would do what the OP thinks reshape does. EDIT: See https://github.com/PDLPorters/pdl/issues/217 for discussion of reshape and its problems.