Повторяемость и модуль Random в разных версиях OCaml - PullRequest
1 голос
/ 31 января 2012

Я настраивал набор тестов вместе с развитием приложения, которое пишет моя команда, и сегодня я столкнулся с проблемой в том, как я собирался тестировать сценарии, которые запускаются через наше приложение.Мы позволяем пользователю установить начальное значение для модуля Random, чтобы обеспечить повторяемость результатов (это очень важно в научном приложении). Я использую это в нашем тестовом наборе для сравнения stdout / stderr из набора скриптов с 'утверждено 'работает.

При обновлении этих сценариев я заметил, что все сценарии на некоторых машинах не работают.Вскоре я обнаружил, что это связано с тем, что модуль Random из версии 3.12.0 изменил основную функцию для генерации случайных битов.В настоящее время мы запускаем несколько версий OCaml (включая 3.13) в нескольких средах (win32, osx, linux), и мы бы предпочли провести тестирование на разных версиях OCaml.

Я хотел бы заменить *Модуль 1009 * из 3.12.1 в наш дистрибутив для обеспечения согласованности независимо от версии OCaml, с которой компилируется пользователь.Но наивный подход к удалению модуля Random в исходном каталоге сообщает, что компилятор обнаружил два файла, которые определяют модуль с именем Random.

Есть предложения по решению этой проблемы?Я понимаю, что могу переименовать Random в XRandom и затем использовать этот модуль, чтобы определить, что мне нужно, или включить стандартный библиотечный случайный модуль, но это потребует изменения каждого вызова функции и позволит разработчикам продолжать (случайно) использовать Random вместо перегруженной версии.Есть ли способ выбрать определенный случайный модуль во время компиляции?Или, может быть, какой-то другой вариант, о котором я не знаю.

EDIT :

Я просто взял модуль Random из OCaml 3.12.1 и поместил его в свой проект, наКомпиляция через OCamlbuild Я получил следующее сообщение об ошибке во время компоновки (это та же ошибка с OCaml 3.13.0 + dev8, и в значительной степени то, что я ожидал, когда я это сделал),

Error: Files random.cmx and /opt/ocaml-3.12.1/lib/ocaml/stdlib.cmxa
       both define a module named Random

И строка компоновки,

  • / opt / ocaml-3.12.1 / bin / ocamlopt.opt dynlink.cmxa unix.cmxa str.cmxa bigarray.cmxa -I + camlp4 camlp4fulllib.cmxa -cclib -lcside -cclib -L.-ccopt -I -ccopt / usr / lib -cclib -L.-cclib -Wl, -не по мере необходимости -cc gcc -cclib -llapack -cclib -lblas -cclib -lgfortran -cclib -lz -cclib -lreadline -cclib -lm -cclib '' compileFlags.cmx all_sets.cmx random.cmx status.cmx timer.cmx sexpr.cmx xml.cmx bitSet.cmx lz.cmx fileStream.cmx method.cmx utl.cmx cost_matrix.cmx alphabet.cmx primes.cmx fileContents.cmx numeric.cmxversion.cmx scripting.cmx libgrappa.a libgzcaml.a libzlibstubs.a libcside.a -o scripting.native

1 Ответ

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

Вы действительно можете использовать свой собственный модуль XRandom и добавить module Random = XRandom вверху тестовых файлов.

К сожалению, я боюсь, что нет хорошего и чистого решения вашей проблемы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...