Are All Types First-Class?

In other words, can you have an object in Magpie that represents the type Int | Bool?

Answer: Yes.

Things like generics will need to internally store their type parameters. For example:

class List[E]
    items E[]
end

That type parameter should be useful at the type level, for things like:

def List[E] add(item E)
    // ...
end

But should also be directly available in the same way that you can do typeof(T) in C#:

def List[E] displayItemType()
    print(E string)
end

This is fine if you only instantiate generics with class type arguments. But it's perfectly valid to also do:

var optionalInts = List[Int | Nothing] new

Which implies that Int | Nothing must itself resolve to a first-class object in Magpie.

This is good because (as of 8/19) that's the current path the implementation is taking. It just makes some stuff harder because type checking has to bounce between Java and Magpie more than we'd like.

This is also good in that it follows the goal of making everything the interpreter knows also available to Magpie.