Yes, you just need to UTF-8 encode your source file and everything will work as expected. By doing so you loose the ability to use ISO 8859-1 (latin1) characters for program identifiers, you have to restrict yourself to ASCII identifiers. Note also that most functions of the
String module will not work as expected on UTF-8 encoded strings.
Xavier Leroy wrote :
Invalid_argument is very much like a failed assertion: it indicates that something is wrong in the program itself, i.e. negative character positions in string functions. Most programs will not catch Invalid_argument, treating as a fatal error. Others will catch it, but only to enter a piece of generic "recover from unexpected error" code.
Failure, on the other hand, signals errors that can happen in normal runs of the code. For instance, you're converting a user-provided string to a number, and the string does not represent a number. It is expected that the client code catches Failure and recovers gracefully, e.g. by asking for the number again, or producing a precise "syntax error" message.
I recommend the use of Invalid_argument to report "should never happen" conditions at the boundary between library functions and user code. On the other hand, the "Failure" exception is a bit of a legacy from earlier designs [...] and often is not the best way to report "normal error" conditions: instead, you could consider defining your own exceptions [...] or even have your functions return "option" types instead of raising exceptions.
Random's pseudo-random number generators (PNRGs) ?