Complain when wrong

In Dyon, the type checker only complains when it knows something is wrong.

When you do not specify the type of an argument, it defaults to any:

foo(x) = x + 1

fn main() {
    println(foo(false))
}

In the program above, the type checker does not know that something is wrong.

You get a runtime error:

--- ERROR ---
main (source/test.dyon)
foo (source/test.dyon)

Invalid type for binary operator `"+"`, expected numbers, vec4s, bools or strings
1,10: foo(x) = x + 1
1,10:          ^

To get a type error, add the type to the argument:

#![allow(unused)]
fn main() {
foo(x: f64) = x + 1
}

Now the type checker complains, because it knows that false is not f64:

--- ERROR ---
In `source/test.dyon`:

Type mismatch (#100):
Expected `f64`, found `bool`
4,17:     println(foo(false))
4,17:                 ^

Static types are not guaranteed

The type of an argument is not guaranteed to be the given static type.

For example:

foo(x: f64) = x + 1

forget_type(x: any) = clone(x)

fn main() {
    println(foo(forget_type(false))) // ERROR
}

This gives you a runtime error, because the type checker is not that smart.