Frage

Construct ist ein DSL in Python implementiert verwendet, um Datenstrukturen (binäre und Text) zu beschreiben. Sobald Sie die Datenstruktur beschrieben haben, konstruieren kann es für Sie analysieren und bauen. Was gut ist ( "DRY", "deklarative", "Denotationelle-Semantics" ...)

Anwendungsbeispiel:

# code from construct.formats.graphics.png
itxt_info = Struct("itxt_info",
  CString("keyword"),
  UBInt8("compression_flag"),
  compression_method,
  CString("language_tag"),
  CString("translated_keyword"),
  OnDemand(
    Field("text",
      lambda ctx: ctx._.length - (len(ctx.keyword) + 
      len(ctx.language_tag) + len(ctx.translated_keyword) + 5),
    ),
  ),
)

Ich bin in der Notwendigkeit für ein solches Werkzeug für Haskell und Ich frage mich, ob so etwas wie dieses existiert.

Ich kenne:

  • Data.Binary: User implementiert Parsing und Gebäude getrennt
  • Parsec: Nur für die Analyse? Nur für Text?

Ich denke, man muss Template Haskell verwenden, um dies zu erreichen?

War es hilfreich?

Lösung 3

Zur Zeit (afaik) gibt es keine Entsprechung in Haskell zu konstruieren.

Eine implementiert werden kann Template Haskell verwendet wird.

Andere Tipps

Ich würde sagen, es hängt davon ab, was Sie tun wollen, und wenn Sie mit jedem vorhandenen Format entsprechen.

Data.Binary wird (Überraschung!) Helfen Ihnen bei der binären Daten, Lesen und Schreiben. Sie können entweder den Code selbst schreiben lesen / schreiben, oder gehen die Details lassen und den erforderlichen Code für Ihre Datenstrukturen einige zusätzliche Tools wie DRIFT oder Derive . DRIFT arbeitet als Prä-Prozessor, während Derive als Prä-Prozessor und mit TemplateHaskell arbeiten kann.

Parsec wird Ihnen helfen, nur mit Parsing Text. Keine Binärdaten (so leicht), und kein Schreiben. Gearbeitet wird mit regelmäßigen Strings getan. Es gibt ByteString Äquivalente auf Hackage.

Für Ihr Beispiel über I Data.Binary verwenden würde und benutzerdefinierten put / geters selbst schreiben. Werfen Sie einen Blick auf die Parser Kategorie bei Hackage mehr Optionen.

Ich weiß nichts über Python oder bauen, so ist dies wahrscheinlich nicht das, was Sie suchen, aber für einfache Datenstrukturen können Sie immer derive gerade lesen:

data Test a = I Int | S a deriving (Read,Show)

Nun, für den Ausdruck

read "S 123" :: Test Double

GHCi emittieren: S 123,0

Für komplexere etwas, können Sie eine Instanz lesen mit Parsec machen.

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