Как отследить программу для отладки в OCaml? - PullRequest
9 голосов
/ 24 февраля 2012

У меня есть общий вопрос относительно практики кодирования ...

При отладке, в какой-то момент моего кода, мне нужен код для печати текущего состояния;Когда я не отлаживаю, я не хочу оставлять код там, потому что он мешает видимости другого кода ...

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

Итак, как вы вообще управляете этим видом "печати / проверки" кода?есть ли хорошая практика?

Ответы [ 3 ]

6 голосов
/ 24 февраля 2012

Раньше у меня была функция отладки, которая выводила бы только финальную строку, только если был установлен флаг. Теперь я предпочитаю просто добавить if операторов:

  • они не намного длиннее
  • ничего не вычисляется, если условие ложно
  • при чтении кода легко увидеть, что это только для отладки

Раньше у меня также были макросы camlp4, которые генерировали бы операторы if из функций-приложений, но это работает только в проектах, где используется camlp4, которых я стараюсь избегать в настоящее время.

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

5 голосов
/ 24 февраля 2012

Я часто использую функцию отладки, которая печатает значение, только когда для флага отладки установлено значение true:

let debug_flag = ref false

let debug fmt = 
  if !debug_flag then Printf.eprintf fmt 
  else Printf.ifprintf stderr fmt
4 голосов
/ 27 февраля 2012

Я использую расширение синтаксиса регистрации:

http://toss.svn.sourceforge.net/viewvc/toss/trunk/Toss/caml_extensions/pa_log.ml?revision=1679&view=markup

Вы также можете передать номер строки в функцию регистрации (которая жестко задана для AuxIO.log в указанном выше источнике)используя Loc.start_line _loc (возможно, я его добавлю).

Обратите внимание, что условное выражение должно быть частью расширения синтаксиса, поэтому оно не будет вычислять аргументы, если не нужно их печатать.Также у нас есть гибкий синтаксис "printf".

Кроме того, я использую команду в Emacs:

(defun camldev-insert-log-entry ()
  (interactive)
  (insert "(* {{{ log entry *)
LOG 2 \"\";
(* }}} *)")
  (goto-char (- (point) 12)))

вместе с `fold-mode '.

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