Question

Si vous citez

<@ 1 + 1 @>

Je veux "1 + 1"

au lieu de

"Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [Value (1), Value (1)])"

Pas de solution correcte

Autres conseils

Vous devez écrire vous-même. Voir la F # citations Visualiseur code comme un guide pour transformer les citations d'arbre de syntaxe abstraite.

Je l'ai mis en place un décompilateur de cotation dans le cadre d'un projet open source plus Unquote. Il peut décompiler beaucoup simples F # a cité des expressions comme des chaînes de syntaxe non-lumière d'une seule ligne (voir la page d'accueil du projet pour obtenir une liste des fonctions de décompilation). 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 que est possible d'écrire un décompilateur de cotation qui peut générer correct F # code. Prendre des expressions du et les expressions de calcul par exemple, le décompilateur Unquote peut produire un code correct F # 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 des sources telles que les nouvelles lignes et indentation est un sujet intéressant (bien que, je pense pas très difficile). Cependant, une seule ligne de syntaxe non-lumière est suffisante pour les besoins de Unquote.

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 match. Il est le sucre syntaxique pour un tas de si et déclarations commutateur (essayez d'imprimer un devis avec un match, vous verrez). Un autre de ces expressions sont Biggies de calcul, mais je suppose que vous pouvez ignorer ceux d'abord.

Ensuite, il y a un trou de lapin d'ambiguïtés que vous aurez à résoudre, avec les conventions comme l'opérateur de conduite commence une nouvelle ligne, nous commence une nouvelle ligne, l'indentation, infix, préfixe, des cas particuliers comme le (: :) opérateur et ainsi de suite.

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

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