On Wed, Oct 26, 2005 at 01:17:10AM +0200, Juerd wrote:
: Larry Wall skribis 2005-10-25 15:51 (-0700):
: > ^T would still have to be a placeholder variable.
: 
: Which it is, in a way.

Though we don't currently allow placeholders in ordinary sigs, or even
in conjunction with ordinary sigs.

: Still, I don't think ^ as a sigil needs to mean the same thing as ^ as a
: twigil. Visually similar pairs are also not related:
: 
:     ?foo        $?foo
:     *foo        $*foo
:     +foo        $+foo
:     =foo        $=foo
:     <foo ...>   $<foo

True, though it would be the first time we used the same character as
both a sigil and a twigil.  ^^T would certainly be a placeholder
in that case, but that might be confusing.

: I think that it would help, and in different ways, even, to see ¢ as a
: prefix operator with special syntax, instead of as a sigil. It doesn't
: fit well in the list of sub, hash, array, scalar. 

But then you can't have ¢*T, ¢+T, ¢^T, ¢?T, ¢.T, etc.

By the way, the meaning of the + twigil just changed.  Last week it
meant "The $? of the currently compiling unit".  That's been taken
over by the COMPILING::<$?foo> notation, partly because I wanted to
steal $+ for generalized "environment" variables, that is, dynamically
visible lexicals, such as $_.  See

    http://svn.perl.org/perl6/doc/trunk/design/syn/S02.pod

I've also checked in various changes to

    http://svn.perl.org/perl6/doc/trunk/design/syn/S06.pod

[Everyone please remember to start new threads for unrelated topics.]

: Making it a prefix op would allow whitespace after it, which would make
: the "class" keyword not seem so desperato. (I think it's a bad keyword
: for this, and picking ^ instead would render it unnecessary, but more
: about why I think "class" is bad for this in a later post.)

Let's delete "sub" too while we're at it.  :-)

I'm not stuck on "class" as the ASCII workaround.  It's not quite the
same as "sub" since we don't allow "sub X" everywhere we allow "&X".

: > And it might conflict with infix ^ if we ever allow xor'ed types,
: > since declarations contain lots of things that look like juxtaposed
: > terms.
: 
: Is this the same "conflict" that occurs in %foo % %bar? 

Nope.  Normal expressions always know whether they're expecting a term
or operator.  I'm talking about in signatures where (it seems to me)
terms are juxtaposed to mean "and", and the available operators
can only be ones that can't be confused with a term prefix or zone
marker.  We actually had that problem back when we had junctional
types:

    T1&T2

Is that a sub T2 returning a T1?

    T1 &T2

Or is a type constraint that must match both types?

    T1 & T2

Currently we've said that such junctions should be down in a "where"
clause, but it would be nice to leave the door open for

    Int|Str

type constraints.  But it's somewhat problematic to have a junctional
return type, so maybe that will never happen, and the most complicated
thing we'll see (in the absence of where clauses and subsignatures),
is

    sub foo (Mammal ¢T $fido)

In that case ^ or | could be forced to work.  But I'd still rather use
something that doesn't shout "operator", especially if the notation can
sneak into rvalue code.  And I'd prefer to leave the ASCII characters
available for real operators and metaoperators later.

: (I cannot imagine needing a one() junction for types, by the way. If
: someone can come up with a good real-life example, please do so.)

Oh, that's easy, for some definition of "real".  In real life, cats and
dogs don't overlap, so if you say Cat|Dog, you really mean Cat^Dog.
But these junctional types are only good for constraints.  A given
object may only have a set of types, not a junction of types.

Larry

Reply via email to