This is a brain-dump of how container types and contexts work in the
new Pugs runcore.

Assuming everything other than an explicit method call is subject to
MMD, we have this desugaring:

    # Sugared syntax
    ${$x} = 5;

    # Desugared syntax
    &infix:<=>(&circumfix:<${ }>($x), 5);

It's straightforward to type the relevant &infix:<=> part, given that
::Scalar, ::Array and ::Hash are roles that "does" the ::Ref role.

    proto infix:<=> ((Ref of ::v) ::a is rw, ::v) --> ::a;
    multi infix:<=> ((Scalar of ::v) ::a is rw, ::v) --> ::a {...}

However, what should the type of &circumfix:<${ }> be?

I'm currently going with:

    proto circumfix:<${ }> (Any) --> (Scalar of Any) is rw;
    multi circumfix:<${ }> ((Scalar of Any) ::a) --> ::a is rw {...}

That is, it applies to an argument that can yield a Scalar object when
used as a rvalue.

Below I'll use the notation value($x) to mean $x evaluated as an
rvalue, analogous to
the variable($x) special form for marking explicit lvalues.

Here is the signature for for prefix:<\>:

    proto prefix:<\> (Any) --> (Ref of Any);
    multi prefix:<\> (Ref ::T is rw) --> ::T {...}
    multi prefix:<\> (::T) --> (Scalar of ::T) {...}

So these two are legal:

    ${ \3 };                   # value(&prefix:<\>(3))   yields a
::Scalar container object
    ${ \$x };                 # value(&prefix:<\>($x)) is just variable($x)

But these are not:

    ${ \3, };                  # value(&prefix:<\>(&infix:<,>(3)))  
yields a ::Tuple, not ::Scalar
    ${ variable($x) }; # value(variable($x))     means the same as value($x)

Thanks,
Audrey

Reply via email to