On Tue, May 03, 2005 at 05:06:15PM +0800, Autrijus Tang wrote: : With the recent discussion on type sigils, and the fact that Pugs : is moving toward the OO core, I'd like to inquire how the following : statements evaluate (or not): : : # Compile time type arithmetic? : ::Dual ::= ::Str | ::Num;
Yes, but I think that is the same as our ::Dual ::= ::Str | ::Num; which sets Dual in the current package, not in *. Also, the :: is of course optional on the existing types. : $*Dual ::= ::Str | ::Num; Probably works, assuming types autoenreference in scalar context so that $*Single ::= Str; is equivalent to $*Single ::= \Str; : # Run time type arithmetic? : my ::dual := ::Str | ::Num; Yes. : # Type Instantiation? : sub apply (&fun<::a> returns ::b, ::a $arg) returns ::b { : &fun($arg); : } The first parameter would be &fun:(::a) these days, but yes. (Stylistically, I'd leave the & off the call.) : # Does Role live in the same namespace as Types/Classes/Modules/Packages? : my ::role = role { ... }; Yes, though in this case that namespace is a subset of the lexical namespace. : # Can class take type parameters like Roles cna? : class Pet[Type $petfood] { : method feed (::($petfood) $food) {...} : } Don't think so. I'd like to keep generics/parametric types associated with roles if possible, so that we know exactly when they are composed into a class. If that means we have to write a few classes that do nothing but wrap around a role, I think it's probably worth it. : # Single colon as tuple composer? : my $Triple ::= :(Bool, Int, Str); : my $TripleTuple ::= :($Triple, $Triple); : my &pair_with_int ::= -> Type ::t { :(::t, Int) }; I think of it as the signature composer. Does Haskell call them tuples? That word tends to mean any immutable list in other circles, though I suppose :(4, 2, "foo") could be construed as a type whose values are constrained to single values. But it makes :(int $x) terribly ambiguous if it's an evaluative context. (Which is why we wanted :() in the first place, to avoid such evaluation.) Larry