More hyper-operators
--------------------
Incidentally, is there any chance we'll have more than one official
hyper-operator in Perl6? According to the S3, there's only one, "the"
hyper-operator, >><<. If I understand, hyper-operators are just operators
which operate on functions (including operators). We effectively already have
three more hyper-operators, "sort", "map" and "grep", all of which are
operators which take one function and one array. But I can also see uses for
some of the other ones from APL (where they call hyper-operators operators).
Maybe if we could work out some way to take the current perl
hyper-operator, and have it optionally f-Reduce (see APL) rather than
expanding arrays. Then we could do something better than:
----------------------------------------
@array = qw(1 2 3 4 5 6 7 8);
foreach(@array) { $total += @array; }
eg.
$total +=<<< @array;
----------------------------------------
For f-Reduce:
http://www.info.univ-angers.fr/pub/gh/wAides/sax6_userdoc.pdf
Look under Language Guide/Operators.
Yes, I suspect we really can't use <<<; maybe we could use some
unicode thing.
New comparison operator
-----------------------
It'd be nice to have a subset operator. If one operand is an array,
it says whether the other operand is a subset of it. If both operands are
scalar, it returns the position of one as a substring in the other.
Override comparison function
----------------------------
We have two set of operators for comparison, one for numeric, and one
for string. There are a variety of other comparisons possible, for example
case insensitive, soundex, Wagner-Fischer (cf. Text::WagnerFischer, agrep,
etc). I know that the first two can be simulated by running both operands
through a conversion function first, but this is a pain in eg. sort.
I was thinking that this also could be resolved with hyper-operators.
Imagine two hyper-operators, which I will call <s> (string), and <o> (other)
(these are not suggested syntax, but placeholders in this discussion). Then
we could do:
$a == $b
$a ==<s> $b
$a ==<o> $b
The first would be a numeric comparison, as always. The second would
be a string comparison. The third would be another comparison, and could be
redefined with eg. "use Text::WagnerFischer" or "use Text::Soundex".
It'd also be cool if we could do:
@a = sort<=><s> @b
(sort would default to sort <=>, but the above would do a string
comparison).
Or, as an alternate syntax (I don't mind the syntax, I just want the
functionality), we could have an internal function called eg. scalar_compare,
which points to scalar_compare_string. We'd keep all the current operators,
but when someone did "use Text::WagnerFischer qw(override_compare)", it would
repoint scalar_compare at scalar_compare_WagnerFischer, and all string
comparison functions (eg. eq, ne, sort) would automatically use the new
function.
Note both ways achieve what I want, but the first would have overrides
on a per-operator basis, whereas the second would make it the default for all
comparison functions. There are various middle ways, but I think the whole
thing could be easier this way.
Array operators (functions?)
---------------
It'd be nice to have awway union and intersection operators. I'm
assuming that all arrays in the following example have unique elements
(speaking of which, I'd like a uniq function to be part of perlfunc).
Union: Easily simulated with (@a, @b) ==> uniq ==> @c
Intersection: this one's harder:
foreach $avar (@a) { push @c, grep { /$avar/ } @b; }
-or-
@c = map { $avar = $_; grep { /$avar/ } @b } @a;
-or-
@a ==> map { $avar = $_; @b ==> grep { /$avar/ } } ==> @c;
...none of which are neat. Assuming we don't get an extra magic
variable (ie. $_ = this, $!!! = $that), it'd be nice to have something that
does this.
getfiledir function
-------------------
I don't see anything that talks about a perlfunc rewrite, so I thought
I'd comment on the one function I use in nearly *every* perl program I write.
Here it is:
sub getfiledir {
my($file) = @_;
my(@lines);
if(-d $file) { return(glob($file)) }
else {
open(FILE, $file) or die "Error: Can't open file '$file': $!";
@lines = <FILE>;
close(FILE) or die "Error: Can't close file '$file': $!";
}
}
That also lets me pass in command pipes ending in |.
-------------------------------------------------------------------
Anyway, hopefully someone will point out an easy way to do one or two
of the above with existing features, and the other(s) will be useful to the
community.
:)
---------------------------------------------------------------------
| Name: Tim Nelson | Because the Creator is, |
| E-mail: [EMAIL PROTECTED] | I am |
---------------------------------------------------------------------
----BEGIN GEEK CODE BLOCK----
Version 3.12
GCS d+ s:- a- C++>++++$ U++ P++ L++ E- W+++ N+ w>--- V- Y+>++
PGP->++ R !tv b++ DI++++ D+ G e++>++++ h! y-
-----END GEEK CODE BLOCK-----