"failwith" больше не разрешен? - PullRequest
2 голосов
/ 31 января 2012

У меня есть список .ml для компиляции, определенный в моем makefile, завершенный main/mail.ml.

У меня есть failwith "to do" как тело некоторых функций в этих файлах.Раньше я помню, что возникает ошибка, только когда выполнение функции требует выполнения во время выполнения.

Сегодня компиляция всех моих .ml работает отлично: генерируются .cmi, cmx и .o.Но когда я запускаю основной двоичный файл, он, кажется, не запускает сначала то, что находится в let () из main.ml, вместо этого, кажется, что он сначала проверяет все файлы списка .ml в makefile и вызываетFatal error: exception Failure("to do") make: *** [all] Error 2 когда встречается первое faiwith "to do".

Я нахожу это поведение очень странным, может кто-нибудь сказать мне, в чем может быть причина?Что-то не так в моих makefile или main.ml?

1 Ответ

5 голосов
/ 31 января 2012

failwith все еще разрешено!Но это иногда случается и со мной.

Обычно проблема заключается в том, что вместо сбоя функционального значения вы совершаете сбой нефункционального значения, что означает, что failwith находится вфакт выполняется во время инициализации модуля.Таким образом, вполне вероятно, что где-то в вашем коде вы написали:

let f = failwith "TODO"

, где failwith выполняется при инициализации модуля вместо :

let f x = failwith "TODO"

, где failwith выполняется, когда функция f фактически вызывается с аргументом.

...