How did Lisp solve (40 years ago) the problem of generating a compile time errors when types of the arguments into a function call did not match with what the developer of the function anticipated?
When you look at error messages of C++ inside of metaprogramming code you understand that the error reporting in case of argument mismatch is still not solved .... :)