Существует ли инструмент OCaml для поддержки использования лучших практик, таких как Perl :: модуль Critic? - PullRequest
8 голосов
/ 03 января 2011

Существует ли инструмент, который анализирует программы OCaml и предлагает некоторые улучшения в стиле и коде?В мире Perl все еще существует Perl :: Critic , чтобы избежать плохого стиля.

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

Есть подсказки?

1 Ответ

9 голосов
/ 03 января 2011

Я не использовал его, но сообщение в группах Caml на прошлой неделе упоминает Талисман . Похоже, что вы после. Я не уверен в критериях хвостовой рекурсии; автор вышеупомянутого проекта не упоминает их, но упоминает возможности плагина.

В качестве альтернативы, компиляция с -dlinear (для ocamlopt[.opt]) создаст линеаризованный код, который упоминает, если функция является хвостовым вызовом. -annot также производит информацию о хвостовом вызове, но я не могу найти ссылку, кроме changelog (он был добавлен в 3.11.0). Каким образом он помечает хвостовые вызовы, не выполняет обратное, помечает не хвостовые вызовы (или, может быть, есть способ?). Ниже приведен пример вывода для функции с именем sum,

let rec sum a = function
    | x when x = 0 -> a
    | x -> sum (a+1) (x-1)

производит (среди гораздо большей продукции),

*** Linearized code
camlTail__sum_58:
  if x/30[%rbx] !=s 1 goto L100
  return R/0[%rax]
  L100:
  I/31[%rbx] := I/31[%rbx] + -2
  I/32[%rax] := I/32[%rax] + 2
  tailcall "camlTail__sum_58" R/0[%rax] R/1[%rbx]

Я думаю, что опыт будет вашим лучшим выбором. Просмотрите некоторые популярные проекты (например, Battery ), чтобы почувствовать стиль и типичные условные обозначения. Я не думаю, что плагин поможет вам назвать ваши аккумуляторные переменные acc или продолжения cont.

...