Мне любопытно узнать, как исключения выполняются в OCaml, чтобы сделать их такими легкими. Используют ли они setjmp/longjmp или они возвращают специальное значение в каждой функции и распространяют его?
Мне кажется, что longjmp немного напрягся в системе, но только тогда, когда возникает исключение, при проверке для каждого возвращаемого значения функции нужно будет проверять каждое и каждое значение после вызова функции, что, кажется, я бы поставил много проверок и прыжков, и, похоже, это будет хуже.
Посмотрев, как OCaml взаимодействует с C (http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc142), и, смотря на callback.h, кажется, что исключение помечено с помощью выравнивания памяти объектов (#define Is_exception_result (v) (((v) и 3) == 2)). Это, по-видимому, указывает на то, что его реализация не использует longjmp и проверяет каждый результат функции после каждого вызова функции. Это оно? Или функция C уже пытается поймать какое-либо исключение, а затем преобразует ее в этот формат?
Спасибо!