2011-01-03 8 views
8

Gibt es ein Tool, das OCaml-Programme analysiert und einige Verbesserungen in Stil und Code vorschlägt? In der Welt von Perl gibt es immer noch Perl::Critic, um schlechten Stil zu vermeiden.Gibt es ein OCaml-Tool, das Best Practices wie Perls Perl :: Critic-Modul unterstützt?

Was ich brauche, sind einige Werkzeuge, die Hinweise nicht nur über Stil machen, sondern auch um Dinge sauberer zu machen und Konstrukte zu vermeiden, die in OCaml-Programmen nicht tail rekursiv sind.

Irgendwelche Hinweise?

Antwort

9

Ich habe es nicht verwendet, aber eine message on the Caml Groups letzte Woche erwähnt Mascot. Es sieht so aus, als ob Sie danach suchen. Ich bin mir nicht sicher über die Tail-Recursion-Kriterien; Der Autor des oben genannten Projekts erwähnt sie nicht, erwähnt aber Plugin-Fähigkeiten.

Alternativ kann das Kompilieren mit -dlinear (für ocamlopt[.opt]) linearisierten Code erzeugen, der angibt, ob die Funktion ein Tail-Call ist. -annot produziert auch Tail-Call-Informationen, aber ich kann keine Referenz neben der changelog finden (es wurde in 3.11.0 hinzugefügt). Auf welche Art und Weise es Tail-Calls taggt, es nicht die Converse, Tag Non-Tail-Calls (oder vielleicht gibt es einen Weg?). Unten ist ein Beispiel für die Ausgabe für eine sum,

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

erzeugen aufgerufene Funktion (viel mehr Leistung unter),

*** 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] 

Ich denke, Erfahrung, obwohl die beste Wahl sein wird. Sehen Sie sich einige beliebte Projekte an (zB Batteries), um ein Gefühl für Stil und typische Konventionen zu bekommen. Ich glaube nicht, dass ein Plugin Ihnen helfen wird, Ihre Akkumulatorvariablen acc oder Fortsetzungen cont aufzurufen.