1=head1 NAME
2
3PDL::Lvalue - declare PDL lvalue subs
4
5=head1 DESCRIPTION
6
7Declares a subset of PDL functions so that they
8can be used as lvalue subs. In particular, this allows
9simpler constructs such as
10
11  $a->slice(',(0)') .= 1;
12
13instead of the clumsy
14
15  (my $tmp = $a->slice(',(0)')) .= 1;
16
17This will only work if your perl supports lvalue subroutines
18(i.e. versions  >= v5.6.0). Note that lvalue subroutines
19are currently regarded experimental.
20
21=head1 SYNOPSIS
22
23 use PDL::Lvalue; # automatically done with all PDL loaders
24
25=head1 FUNCTIONS
26
27=cut
28
29package PDL::Lvalue;
30
31# list of functions that can be used as lvalue subs
32# extend as necessary
33my @funcs = qw/ clump diagonal dice dice_axis dummy flat
34                index index2d indexND indexNDb mslice mv
35                nslice nslice_if_pdl nnslice polyfillv px
36                range rangeb reorder reshape sever slice
37                where whereND xchg /;
38
39my $prots = join "\n", map {"use attributes 'PDL', \\&PDL::$_, 'lvalue';"}
40  @funcs;
41
42=head2 subs
43
44=for ref
45
46test if routine is a known PDL lvalue sub
47
48=for example
49
50  print "slice is an lvalue sub" if PDL::Lvalue->subs('slice');
51
52returns the list of PDL lvalue subs if no routine name is given, e.g.
53
54  @lvfuncs = PDL::Lvalue->subs;
55
56It can be used in scalar context to find out if your
57PDL has lvalue subs:
58
59  print 'has lvalue subs' if PDL::Lvalue->subs;
60
61=cut
62
63sub subs {
64  my ($type,$func) = @_;
65  if (defined $func) {
66    $func =~ s/^.*:://;
67    return ($^V and $^V >= 5.006007) && scalar grep {$_ eq $func} @funcs;
68  } else {
69    return ($^V and $^V >= 5.006007) ? @funcs : ();
70  }
71}
72
73# print "defining lvalue subs:\n$prots\n";
74
75eval << "EOV" if ($^V and $^V >= 5.006007);
76{ package PDL;
77  no warnings qw(misc);
78  $prots
79}
80EOV
81
82=head1 AUTHOR
83
84Copyright (C) 2001 Christian Soeller (c.soeller@auckland.ac.nz). All
85rights reserved. There is no warranty. You are allowed to redistribute
86this software / documentation under certain conditions. For details,
87see the file COPYING in the PDL distribution. If this file is
88separated from the PDL distribution, the copyright notice should be
89included in the file.
90
91=cut
92
931;
94