2009-08-03 7 views
2

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 (« sec », « déclaratives », « dénotationnelle-Sémantique » ...)Haskell équivalent de "Construct" de Python

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

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

Je sais de:

  • Data.Binary: L'utilisateur met en œuvre l'analyse syntaxique et la construction séparement
  • parsec: Seulement pour l'analyse syntaxique? Seulement pour le texte?

Je suppose qu'il faut utiliser Template Haskell pour y parvenir?

+1

+1. J'adore 'construire' –

Répondre

0

Actuellement (afaik) il n'y a pas d'équivalent à Construct in Haskell.

On peut être implémenté en utilisant Template Haskell.

0

Je ne sais pas quoi que ce soit sur Python ou la construction, il est sans doute pas ce que vous recherchez, mais pour de simples structures de données que vous pouvez toujours Dérive lire:

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 quelque chose de plus complexe, vous pouvez faire une instance de lecture à l'aide parsecs.

+0

Je pense que vous vouliez dire * emettre * pas * omettre *. – rampion

+0

@rampion: Oui, vous avez raison, je l'ai corrigé. Je vous remercie! – fishlips

+0

@fishlips: Construct vous permet d'analyser des formats de fichiers/protocoles spécifiques. Si vous définissez simplement un type équivalent aux données contenues dans un fichier PNG, its 'read' ne traitera pas les fichiers PNG.Parsec ne résout pas mon problème car je veux décrire le format une seule fois, puis pouvoir à la fois l'analyser et le construire, pas seulement analyser. – yairchu

1

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

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

Parsec ne vous aidera que pour l'analyse de texte. Pas de données binaires (aussi facilement), et pas d'écriture. Le travail est effectué avec String s. Il y a ByteString équivalents sur hackage.

Pour votre exemple ci-dessus, j'utiliserais Data.Binary et j'écrirais moi-même les codes put/get. Jetez un oeil à la parser category at hackage pour plus d'options.

+1

@L. Kolmodin: merci. si je comprends bien, DrIFT et Derive dérivent automatiquement des instances pour moi. ce qui signifie que je ne peux pas spécifier de quelle manière je veux que les données soient formatées. Aucun paquet dans la catégorie analyse ne semble faire ce dont j'ai besoin. La seule chose que j'ai trouvée similaire à Construct est "Pickling Combinators" (http://research.microsoft.com/~akenn/fun/picklercombinators.pdf). – yairchu

+1

@yairchu: Oui, DrIFT et Derive dériveront automatiquement les instances. http://hackage.haskell.org/package/BitSyntax peut également être d'intérêt, semble similaire à votre exemple, bien que je ne sais pas comment il est stable. API: http://hackage.haskell.org/packages/archive/BitSyntax/0.3.2/doc/html/Data-BitSyntax.html –

Questions connexes