On Fri, Mar 12, 2004 at 05:32:33AM -0500, Austin Hastings wrote: : Boo, hiss. : : Two things: : : 1- I'd rather use "inplace" than self.
What is this "place" thing? I want the object to do something to itself reflexively, which may or may not involve places... : 2- I'd rather it be AFTER, than BEFORE, the name, because : : method sort : method sort:inplace : : reads, and more importantly SORTS, better than : : method inplace:sort : method sort Well, that's a point that has some weight, but... : To wit: : : method :infix:<=>(Array, Array) returns Scalar : method :infix:==(Array, Array) returns Boolean : method :infix:!=(Array, Array) returns Boolean : method :infix:===(Array, Array) returns Boolean : method :infix:!==(Array, Array) returns Boolean : method :infix:x(Array) returns Array : method :infix:x:inplace(Array is rw) : : ### Note: How to handle [undef]? return-undef, or PHP-like push? : method :postfix:[](Array is rw, ?Scalar) returns Scalar : : ### Inplace-only? : method clear(Array is rw) returns Boolean : : method compact(Array) returns Array : method compact:inplace(Array is rw) : ### Inplace-only? : method delete(Array is rw, Int) returns WHAT, exactly? : : method difference(Array, Array) returns Array #A-B : method differences(Array, Array) returns Array #(A-B) + (B-A) : method exists(Array, Scalar) returns Boolean : method flatten(Array) returns Array : method flatten:inplace(Array is rw) returns Array : method grep(Array, Code) returns Array : method includes(Array, Scalar) returns Boolean : method index(Array, Scalar) returns Int : method intersect(Array, Array) : method is_empty(Array) return Boolean : method join(Array, String) : method length(Array) : method map(Array, Code) returns Array : method pack(Array, String) returns String : method reverse(Array) returns Array : method reverse:inplace(Array is rw) : method rindex(Array) returns Int : : ### Boy are these likely to be wrong! : method sort(Array, ?Code) returns Array : method sort:inplace(Array is rw, ?Code) : : ### Inplace-only? : method splice(Array is rw, ?Int, ?Int, ?Array) : : method union(Array, Array) returns Array : method unique(Array) returns Array : method unique:inplace(Array is rw) : : ### Inplace-only? : multi method fill(Array is rw, Scalar, Int, Int) : multi method fill(Array is rw, Scalar, Int) : multi method fill(Array is rw, Scalar, Array) : ### Inplace-only? : multi method pop(Array is rw, ?Int) returns Array : multi method pop(Array is rw) returns Scalar : ### Inplace-only? : multi method unshift(Array is rw, Scalar) returns Array : multi method unshift(Array is rw, Array) returns Array : ### Inplace-only? : multi method push(Array is rw, Array) returns Array : multi method push(Array is rw, Scalar) : ### Inplace-only? : multi method shift(Array is rw, Int) returns Array : multi method shift(Array is rw) returns Scalar : : multi sub each(Array) returns Iterator # HOW does this work? But you can put the declarations in whatever order you want regardless of the default collation order, so this is kind of a weak argument unless you're writing a tool, in which case you could certainly ignore whatever prefixes you like when you sort. : (Note also that :...fix sorts better than in-, post-, and pre-. I'd like to : suggest changing : them, since it costs nothing and results in a mild improvement in automation : behavior.) The main reason those are out front is to reduce grammatical ambiguity when you use an operator sub name where a term is expected. That is, it's harder to parse: $x = +:foo(); correctly than $x = foo:+(); Even with sort:inplace, how does the parser know that the name is "sort:inplace", or whether the user is trying to pass a pair :inplace to the "sort" routine? The foo:-style prefixes are "reserved" in general, but the :foo pair is not, and it would be a mistake to start introducing reserved pairs, I think, much like the Perl 5 problem that ARGV is truly global while ARGH is not. : > > Another interesting question, if the "postfix:.=foo" mess is defined : > > with as self:foo, should infix:+= be defined as self:+ instead? : > > In other words, should the <op>= syntax really be a metasyntax like : > > hyperoperators, where you never actually have to define a C<»+«> : > > operator, but the hyperoperator is always autogenerated from ordinary : > > C<+>? So basically any infix:<op>= gets remapped to self:<op>. : > : > I think that would be cleaner. : : Alternatively, is there a valid reason to *need* to define your own : hyperoperator? : : That is, can you code C< @a +« $x > better than C< @a.map {return $_ + $x} : >? I suspect that it's possible to do so, particularly for such simple cases : as assignment. (Hint: Persistent objects, database, one SQL statement per : assignment.) : : So perhaps I should ask for an :infix:=« operator override? I'm extremely leary of giving people the right to break the "hyper" contract. Which they will do left and right if given opportunity. The hyper contract says @a »operator« @b always applies the operator in parallel to corresponding elements. I don't want people using »« for other higher-order mathmatical operators that just happen to work on arrays of multiple elements. They can find their own operators for that... But if there were a way of keeping the contract while giving the flexibility to the implementor, that would be okay. : > > On the other hand, it also means that : > > someone can say silly things like: : > > : > > $a cmp= $b : > > $a ~~= $b : > > : > > I suppose we could simply disallow meta-= on non-associating operators. : > > Can anyone come up with a non-associating binary operator that *should* : > > have an assignment operator? The basic definition of non-associating : > > seems to be that the type of the arguments is incompatible with the : > > type produced by the operator. Which is precisely the problem with : > > something like : > > : > > $a cmp= $b : > > : > > insofar as $a is being treated as a string at one moment and as a : boolean : > > at the next. : > : > I think it's "merely" a philosophical problem. : > : > After all, we don't complain when people write: : > : > $a = $a cmp $b; : > : > So should we complain when people write exactly the same thing, only as: : > : > $a cmp= $b; : > : > Stylistically, they're equally as abhorrent, but Perl users aren't : expecting : > the Stylish Inquisition. : > : : So long as you allow modifiers in there, as: : : $a cmp:i:n=8= $b; : : I'm okay with it. Good luck with <=>= We're thinking that adverbs on infix ops have to go after the right arg: $a cmp= $b :i:n(8); That is, op modifiers are only allowed where an op is expected. Otherwise we can't use a general :foo() syntax for pairs when terms are expected. Larry