Question

Construct est un DSL implémenté en Python utilisé pour décrire les structures de données (binaires et textuelles). Une fois que vous avez décrit la structure de données, construct peut l’analyser et la construire pour vous. Ce qui est bon ("DRY", "Déclaratif", "Denotational-Semantics" ...)

Exemple d'utilisation:

# 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),
    ),
  ),
)

J'ai besoin d'un tel outil pour Haskell et Je me demande si quelque chose comme ça existe.

Je connais:

  • Data.Binary: l'utilisateur implémente l'analyse et la construction séparément
  • Parsec: uniquement pour l'analyse? Seulement pour le texte?

Je suppose qu’il faut utiliser le modèle Haskell pour y parvenir?

Était-ce utile?

La solution 3

Il n’existe actuellement aucun équivalent à Construct in Haskell.

On peut être implémenté à l'aide de Template Haskell.

Autres conseils

Je dirais que cela dépend de ce que vous voulez faire et si vous devez respecter un format existant.

Data.Binary vous aidera (surprise!) avec des données binaires, à la fois en lecture et en lecture. l'écriture. Vous pouvez écrire le code pour lire / écrire vous-même ou laisser tomber les détails et générer le code requis pour vos structures de données en utilisant des outils supplémentaires tels que DrIFT ou dériver . DrIFT fonctionne comme un pré-processeur, alors que Derive peut fonctionner comme un pré-processeur et avec TemplateHaskell.

Parsec ne vous aidera qu'à analyser le texte. Pas de données binaires (aussi facilement), et pas d'écriture. Le travail est effectué avec des String standard. Il existe des ByteString équivalents sur le hackage.

Pour votre exemple ci-dessus, j'utiliserais Data.Binary et écrirais moi-même put / get . Consultez la catégorie d'analyse au piratage pour plus d'options.

Je ne connais rien à Python ou à Construct, ce n'est donc probablement pas ce que vous recherchez, mais pour les structures de données simples, vous pouvez toujours en déduire ce qui suit:

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

Maintenant, pour l'expression

read "S 123" :: Test Double

GHCi émettra: S 123.0

Pour tout ce qui est plus complexe, vous pouvez créer une instance de Read en utilisant Parsec.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top