The many recent suggestions for denoting vector operators all seem to
have problems, with some having significant impact elsewhere in the
language.  After reading a few hundred mails on the subject I'm no
longer sure what I prefer, but thought I'd be in a better position to
have an opinion if I at least knew what the options were.

In case anybody else feels similarly, I've listed the main contenders
below together with salient points pertaining to them gleaned from this
list.  (Credit to those who originally made them, and apologies for
omitting attributions from this compendium.)

The suggested syntax is demonstrated with the hypothetical C<op>
operator (presumably making it a hyper-hypo op):

  * the "as we were" option: ^op

    » Tilde is used for xor, underscore remains string concatenation.
    » Consistent with previously published Perl 6 code samples.
    » No character left for eating whitespace.
    » No way of distinguishing precedence of vector assignment op.
    » Slightly embarrasing to have so much discussion, go round in
      circles a couple of times, and end up right where we started.

  * the "xor is a double-sided not" option: ^op

    » Exclamation mark is used for xor (in its various forms), leaving
      tilde for concatenation and underscore for eating whitespace.
    » Vector ops remain consistent with previous code samples.
    » No way of distinguishing precedence of vector assignment op.

  * the "looks like an array" option: [op]

    » Seemed a nice idea, but doesn't work with other use of square
      brackets.

  * the "guillemot" option

    » Inconvenient for those who don't live near the sea, and messy even
      for those who do.

  * the "guillemet" option: «op»

    » Looks nice.
    » Awkward to type for some people.
    » May not be transmitted correctly in mailing lists and similar.
    » May not be in the character set used by some people in the world.
    » Has distinct characters for vector ops that have no other meaning
      in Perl.
    » Uses 'special' looking symbols for 'special' ops.
    » Looks really nice.
    » Looks really likely to cause confusion in mailing lists.

  * the "mélange" option: ^[op]

    » Xor continues to use caret.
    » Overcomes problems with using just caret or square brackets.
    » Easy enough to type.
    » Looks ugly and/or unbalanced.
    » Potential for confusion with overloading symbols used individually
      elsewhere in Perl.

  * the "either of the above" option: «op» and ^[op]

    » Can choose the elegance of the guillemet or the type-ability and
      encoding-neutral convenience of the mélange.
    » The non-Ascii characters still cause hassle when they are
      transmitted.
    » The two variants don't look anything like each other.
    » Everybody will have to learn both versions to be able to cope with
      others' code.

  * the "generic extensibility" option: «op» and `<<op`>>

    » Backticks and two-character mnemonics from RFC1345 are used to
      provide an Ascii-only alternative for some symbols.
    » The Perl 5 use of backticks has to be provided some other way.
    » It's neat to have a consistent way of typing special symbols.
    » Possibly overkill if Perl doesn't introduce any standard non-Ascii
      operators other than vector.
    » Having more power in cryptic symbols rather than words may lead to
      increased claims of Perl being unreadable.
    » Still suffers from needing to be able to view and transmit
      non-Ascii characters.

  * the "temelliug" option: »op«

    » Guillemets the conventional way round are used for qw().
    » The same, unusual, symbols are used for two very different
      purposes.
    » Still the non-Ascii problems.

  * the "how many characters?" option:  <<op>>

    » Bitwise shift operators are preceded with a plus (like other
      bitwise ops are).
    » Here-docs require the tag to be quoted.
    » Vector operators take up five or six characters.
    » Probably faster for many people to type than guillemets are.
      (The second of each doubled character is very fast to type.)
    » Vector bitwise shifts may look a little odd.

  * the "single chevrons" option:  <op>

    » The Perl 5 'read a chunk' use of angled brackets needs to be
      provided some other way.
    » Not much to type.
    » Potential (human, if not parser) confusion from same characters
      being used elsewhere in Perl for comparisons and bitwise shifts.

  * the "suggested but not much discussed" options:

      ~op
      ~~op
      `op
      `op`
      *[op]
      .[op]
      =[op]
      ![op]
      _[op]
      :[op]
      '[op]
      ~[op]
      (>op<)
      <)op(>
      >)op(<
      [>op<]
      [)op(]

Phew!  I'm slightly concerned at this list making Piers's job too easy,
but have tried to minimize that effect by posting on a Monday (meaning
that this mail is ineligible for inclusion in the next summary and is
likely to be out of date by the time of the following one).

Smylers

Reply via email to