mason

There are more types than just classes and kinds.

The kind Type can be implemented by anything defining the method has-instance?.

The colon : is special syntax for using instanceof.

Currently it uses a shim because Symbol.hasInstance isn't yet implemented in any JS engine.

When declaring a local, use : to assert its type. For function return types, write the type right after the \.

The Str and Num builtins act like String and Number but recognize primitives instead of the rarely-used object versions. There's also Bool and Sym.

number->string = \:Str _:Num
	"#_"

|| This should fail
number->string []

You can also use value:Type (with no spaces) to call contains?.

For just :Type, the test is on _. (This works great in case expressions!)

. 1:Num
. not 1:Str
_ = "one"
. not :Num
. :Str

Pred-Type

Any predicate can become a Type.

name. adds an object property equal to the current name being assigned to, in this case "Three".
Three = new Pred-Type
	name.
	predicate. \_
		=? _ 3

. 3:Three
. 4:Three

prefix

Mason code often uses prefixes and suffixes to indicate type.

The compiler doesn't treat these specially. msl follows this convention, but you don't have to.

Looks likeMeans
?a? option
$a$ promise
@a@ collection
a->bMap from a to b
a?Bool

An optional promise is ?$a; a promise for an option is $?a.

a! indicates a function that performs some action rather than just returning a value.