On 5/26/2011 8:33 AM, Mr. Puneet Kishor wrote:
On May 26, 2011, at 7:17 AM, Craig DeForest wrote:
Hi, Zeno!
The loss of anonymous method style function calling is a known wart with NiceSlice,
unfortunately. It is a language design issue -- Perl leaves very few of the
"convenient" constructions unused. Since (as you noticed) the&$ref(@params)
syntax is preserved, it has not been a major issue.
Source filters are indeed dangerous, but they remain the only way to affect the
syntax of the language itself until Perl 6 becomes commonplace. NiceSlice has
been rather thoroughly tested, and I use it in essentially all my PDL code.
(Now that I think of it, the C preprocessor is a source filter too...) There
are three warts to the source preprocessing that I know of:
* Function refs:<<$ref->(@params);>> is overloaded with niceslicing syntax; use
"&$ref(@params)" [which you pointed out]
* String interpolation:<<print "$a (comment)";>> gets erroneously turned
into<<print "$a->nslice(comment)", so you have to break up the quoted string. This has to do with
the difficulty of parsing out the Perl quoting structure, which can potentially be fixed -- but nobody has yet felt
moved to do so.
* Inline functions: if you use Inline::C or Inline::PP, you must say "no
PDL::NiceSlice" before the Inline call, else your foreign-language code will get
mangled.
additionally, IIRC, NiceSlice was breaking up my DBI statements. I personally
found NiceSlice to be just as difficult (or easy, depending on one's
perspective) as the regular slice syntax, and stopped using NiceSlice in my
little PDL world.
If I recall correctly, the DBI problem you were
having was for the second case above. It is clear
that the PDL::NiceSlice filter could be made smarter
and more flexible. Some low lying fruit:
(1) make a ->niceslice() method to use where the
source code filtering only takes place inside
the parens of the method call
(2) improve the filter pattern to avoid interpolation
into strings and pod sections
Option #1 seems most likely in the short term since
it should be very easy to implement and would allow
use of PDL::NiceSlice syntax in a method call so
you could use the same syntax for all your slicing
operations.
Cheers,
Chris
On May 26, 2011, at 4:21 AM, Zeno Gantner wrote:
Hi all,
I am still new to PDL, and trying to get more comfortable with it.
So please excuse if my question is somehow naive ...
I found out that PDL::NiceSlice breaks calling function references.
Is this a known bug?
--
#!/usr/bin/perl
use 5.10.1;
use PDL::NiceSlice;
my $fun_ref = sub { say $_[0]; };
&$fun_ref('Hey!'); # works
$fun_ref->('Hey!'); # does not work
--
... gives the output:
--
Hey!
Can't call method "nslice" on unblessed reference at ./pdl-niceslice.pl line 8.
--
By the way, PDL::NiceSlice is implemented as a Perl source filter,
what can be a bit dangerous.
What are the general recommendations towards PDL::NiceSlice? Is its
usage encouraged?
Best regards,
Zeno
_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl