2009-09-19 3 views

Répondre

6

Vous devez écrire vous-même. Voir le code F# quotations visualizer comme un guide pour transformer l'arbre de syntaxe abstraite des citations.

0

Il n'y a pas, et il est pas tout à fait facile, sauf dans des cas très simples. L'un des principaux problèmes, par exemple, est la construction de correspondance. C'est du sucre syntaxique pour tout un tas de déclarations if et switch (essayez d'imprimer une citation avec une correspondance, vous verrez). Un autre de ces biggies sont des expressions de calcul, mais je suppose que vous pourriez les ignorer au début.

Ensuite, il ya un trou de lapin des ambiguïtés que vous aurez à résoudre, avec des conventions comme l'opérateur de tuyau commence une nouvelle ligne, laissez commencer une nouvelle ligne, indentation, infixe, préfixe, cas spéciaux comme le (::) opérateur et ainsi de suite.

Dans l'ensemble, faisable, mais pas trivial. Un peu comme décompiler.

5

J'ai mis en place un décompilateur de cotation dans le cadre d'un projet open source plus Unquote. Il peut décompiler de nombreuses expressions quotées F # simples sous la forme de chaînes de syntaxe non-légères à une seule ligne (voir la page d'accueil du projet pour une liste des fonctions de décompilateur). Par exemple,

> decompile <@ (11 + 3)/2 = String.length ("hello world".Substring(4, 5)) @>;; 
val it : string = 
    "(11 + 3)/2 = String.length ("hello world".Substring(4, 5))" 

@Kurt Schelfthout est correct sur les nombreux défis rencontrés lors de la décompilation F # Les citations en forme lisible par l'homme. Mais de mon travail jusqu'à présent, je crois qu'il est possible d'écrire un décompilateur de cotation qui peut générer correcte code F #. Prendre des expressions du et des expressions de calcul par exemple, le décompilateur Unquote peut produire du code F # correct dans les cas simples suivants:

> decompile <@ match true with | true -> "hi" | _ -> "bye" @>;; 
val it : string = 
    "let matchValue = true in if matchValue then "hi" else "bye"" 

> decompile <@ seq {yield 1; yield 2} @>;; 
val it : string = 
    "seq (Seq.delay (fun unitVar -> Seq.append (Seq.singleton 1) (Seq.delay (fun unitVar -> Seq.singleton 2))))" 

opérateurs infixes et préfixes ne sont pas trop dur (comme vous pouvez le voir dans le premier exemple) , mais la structure de la source comme les nouvelles lignes et l'indentation est un sujet intéressant (mais pas très difficile, je pense). Cependant, la syntaxe non-lumineuse à une seule ligne est suffisante pour les exigences de Unquote.

Questions connexes