Pergunta

Ao citar

<@ 1 + 1 @>

Eu quero "1 + 1"

em vez de

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

Nenhuma solução correta

Outras dicas

Você vai ter que escrevê-lo sozinho. Veja as F # citações Visualizer código como um guia para transformar a árvore de sintaxe abstrata citações.

Eu tenho implementado um decompiler cotação como parte de um projeto open source maior Unquote . Ele pode decompor muitos simples F # expressões citadas como cordas de sintaxe de linha única não-luz (ver página inicial do projecto para uma lista de características decompiler). Por exemplo,

> 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á correto sobre os muitos desafios enfrentados quando Decompiling F # Quotations em um formato legível. Mas do meu trabalho até agora, acredito que ele é possível escrever um decompiler citação que pode gerar correta F # código. Tome expressões de correspondência e expressões de cálculo, por exemplo, o decompiler Unquote pode produzir código correto F # nos seguintes casos simples:

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

Infix e operadores de prefixo não são muito difíceis (como você pode ver no primeiro exemplo), mas a estrutura fonte, como novas linhas e recuo é um tópico interessante (embora não terrivelmente difícil, eu acho). No entanto, a sintaxe de linha única não-luz é suficiente para as necessidades do Unquote.

Não há ninguém, e não é assim tão fácil, exceto em casos muito simples. Um dos principais problemas, por exemplo, é a construção jogo. É um açúcar sintático para um monte de if e switch (tente imprimir uma citação com um fósforo, você vai ver). Mais uma daquelas coisas grandes são expressões de cálculo, mas eu acho que você poderia ignorar aqueles em primeiro lugar.

Depois, há um buraco do coelho de ambigüidades você terá de resolver, com as convenções como o operador pipe inicia uma nova linha, vamos começa uma nova linha, recuo, infix, prefix, casos especiais como o (: :) operador e assim por diante.

Ao todo, factível, mas não trivial. Mais ou menos como Decompiling.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top