Upgrade von FPARSEC: Aktualisieren diskriminierte Gewerkschaften, um die neuen Gleichstellungs-/Vergleichsbeschränkungen zu erfüllen

StackOverflow https://stackoverflow.com/questions/2290103

Frage

Also von a halloLarious -Reihe von Ereignissen, Ich habe die FPARSEC -Quelle heruntergeladen und versucht, sie zu bauen. Leider ist es nicht mit dem neuen 1.9.9.9 kompatibel. Ich habe die einfachen Probleme behoben, aber es gibt ein paar diskriminierte Gewerkschaften, die immer noch nicht funktionieren.

Speziell, Don Symes Post erklärt, dass diskriminierte Gewerkschaften, die Typelemente enthalten obj oder -> Erhalten Sie nicht automatisch Gleichheit oder Vergleichsbeschränkungen, da Objekte den Vergleich und Funktionen auch nicht unterstützen. (Es ist nicht klar, ob die automatisch generierte Gleichheit/Vergleich vorher fehlerhaft war, aber der Code wird jetzt nicht einmal kompilieren, da sie nicht mehr generiert werden.)

Hier sind einige Beispiele für die problematische DUS:

type PrecedenceParserOp<'a,'u'> =
     | PrefixOp of string * Parser<unit,'u> * int * bool * ('a -> 'a)
     | others ...

type ErrorMessage =
     | ...
     | OtherError of obj
     | ...

Hier sind die beleidigenden Verwendungen:

member t.RemoveOperator (op: PrecedenceParserOp<'a, 'u>) =
    // some code ...
    if top.OriginalOp <> op then false // requires equality constraint
    // etc etc ...

Oder für die Vergleichsbeschränkung

let rec printMessages (pos: Pos) (msgs: ErrorMessage list) ind =
    // other code ...
    for msg in Set.ofList msgs do // iterate over ordered unique messages
        // etc etc ...

Soweit ich das beurteilen kann, ist Dons Lösung, jede Instanz mit einem eindeutigen INT zu markieren, der richtige Weg, um eine benutzerdefinierte Gleichstellung/Vergleichsbeschränkung zu implementieren (oder ein einzigartiges Intupel, damit einzelne Zweige des DU bestellt werden können). Dies ist jedoch für den Benutzer des DU unpraktisch. Jetzt erfordert der Bau des DU eine Funktion, um den nächsten Stempel zu erhalten.

Gibt es eine Möglichkeit, das Tag-Getting zu verbergen und den Nutzern der Bibliothek dieselben Konstruktoren vorzustellen? Das heißt, die Implementierung zu ändern, ohne die Schnittstelle zu ändern? Dies ist besonders wichtig, weil es erscheint (wie ich es im Code verstehe), das PrecedenceParserOp ist ein öffentlicher Typ.

War es hilfreich?

Lösung

Welche Quelle haben Sie für FPARSEC heruntergeladen? Ich habe das Neueste vom FPARSEC gepackt Bitbucket -Repository, und ich musste überhaupt keine Änderungen an der FPARSEC -Quelle vornehmen, um sie in VS 2010 RC zu kompilieren.

EDIT: Ich nehme das zurück. Ich habe Fehler bei der Interplexyacc- und InterpFparsec -Beispielprojekte erhalten, aber die Kernprojekte von FPARSEC und FPARSECCS bauen gut auf.

Andere Tipps

Eine Sache, die Sie tun könnten, ist hinzuzufügen [<CustomEquality>] und [<CustomComparison>] Eigenschaften und definieren Sie Ihre eigenen .Equals überschreiben und IComparable Implementierung. Natürlich müssen Sie das umgehen obj und _ -> _ Komponenten selbst auf angemessene Weise, die möglich sind oder nicht. Wenn Sie kontrollieren können, was in die übergeben wird OtherError Konstruktor sollten Sie in der Lage sein, diese Arbeit für die ErrorMessage Geben obj zu einem Typ, der selbst strukturell vergleichbar ist. Allerdings die PrecendenceParserOp Der Fall ist etwas schwieriger - Sie können möglicherweise mit der Verwendung der Referenzgleichheit auf den Funktionskomponenten auskommen, solange Sie auch keinen Vergleich benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top