Thoughts:

Your nomenclature makes me think you are coming from an APL background.

!=== is already generated from ===, and compares the identity of any two objects. It works on binary values since they are value types, but that's not the "proper" usage, and Perl separates out the concerns.

Some of the things you mention do indeed make sense as a principle form for an operator, with the current way a digraph. For example, <=. It's been a digraph approximation for so many decades that we have forgotten. My editor shows the ≤ when it formats <=.

"exists" has already been changed to an adverb on the lvalue, but I suppose a macro could still be made to work.




Darren Duncan darren-at-darrenduncan.net |Perl 6| wrote:
I had some thoughts lately about the Perl 6 operators, and wanted to bounce some ideas.

--------

Firstly, regarding the string replication ops as documented in Synopsis 3, 'x' and 'xx', I'm wondering whether it might be better to have something that incorporates a '~', since that operation is about catenation.

Would perhaps '~*' work better than 'x' to signify better what the operation is doing; the '~' in this case means catenation and the '*' is meant to invoke 'multiply', not 'whatever'. So '~*' means "catenate a multiple of times".

This would then free up 'x' to be used for something else, if anything.

As for a substitution for 'xx', I'm less sure about that.

Thoughts?

Was that operator called 'x' because it was the best or because that was how Perl 5 did it, and Perl 6 wanted to not change things if it didn't need to?

--------

Secondly, regarding the Bool type, I think it would be useful for Perl 6 to define the full complement of dyadic logical operators, of which I count a few that you don't appear to already have. Probably the best place is in Synopsis 32.

Note that all the dyadic ops I am discussing are meant to be read as infix ops only.

These are the boolean/logical ops you already have:

Niladic ops aka value literals / constants:
* Bool::False
* Bool::True

Monadic:
* not aka !, but ¬ alias could be added

Dyadic:
* and aka &&, but ∧ alias could be added
* or aka ||, but ∨ alias could be added
* xor aka ^^ aka !===, but ⊻, ↮ aliases could be added
* ===, but xnor, ↔ aliases could be added

Now I'm not sure whether or not [also, andthen, orelse] have the desired semantics of any others or not, or whether [if, unless] could be used as a value-resulting infix operator or not.

But here are a few more dyadic:
* nand aka ⊼ aka ↑
* nor aka ⊽ aka ↓
* implies aka imp aka →
* nimp aka ↛
* if aka ←
* nif aka ↚

For that matter, as you know, every single boolean/logical operator could also have a bitwise analogue, if people were so inclined.

--------

Thirdly, there are I'm sure a number of other aliases that could be added to other ops, such as ≤ and ≥ for <= and >=, and ≠ for one of the inequality operators, although that last one would probably make more sense if = was the equality test operator, so maybe best to avoid ≠ then.

Lots of the other ones I can think of apply to sets, and the ext/Set.pm bundled with Pugs already documents them quite well.

However, I think some set ops could also be used with hashes. For example, an alternate way of spelling "exists %foo{$bar}" is "$bar ∈ %foo" or "%foo ∋ $bar".

So, any thoughts?

-- Darren Duncan


Reply via email to