Pregunta

al citar

<@ 1 + 1 @>

quiero "1+1"

en lugar de

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

No hay solución correcta

Otros consejos

Vas a tener que escribir por sí mismo. Vea la href="http://tomasp.net/blog/quotvis-reloaded.aspx" F # citas visualizador código como una guía para la transformación de las citas de los árboles de sintaxis abstracta.

Implementé un descompilador de citas como parte de un proyecto de código abierto más grande. entre comillas.Puede descompilar muchas expresiones simples entre comillas de F# como cadenas de sintaxis no ligeras de una sola línea (consulte la página de inicio del proyecto para obtener una lista de las características del descompilador).Por ejemplo,

> 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 tiene razón acerca de los muchos desafíos que enfrentan al descompilar citas de F# en un formato legible por humanos.Pero por mi trabajo hasta ahora, creo que es Es posible escribir un descompilador de citas que pueda generar correcto Código F#.Tomemos como ejemplo las expresiones de coincidencia y las expresiones de cálculo, el descompilador Unquote poder produzca código F# correcto en los siguientes 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))))"

Los operadores de infijo y prefijo no son demasiado difíciles (como puede ver en el primer ejemplo), pero la estructura fuente, como las nuevas líneas y la sangría, es un tema interesante (aunque creo que no es demasiado difícil).Sin embargo, la sintaxis no ligera de una sola línea es suficiente para los requisitos de Unquote.

No hay ninguna, y no es tan fácil, excepto en casos muy sencillos. Uno de los principales problemas, por ejemplo, es el constructo partido. Es el azúcar sintáctica para un montón de if y switch (intenta imprimir una cita con un partido menos, verá). Otro de los biggies son expresiones de cálculo, pero supongo que se podría omitir los que están en primer lugar.

A continuación, hay un agujero de conejo de ambigüedades que tendrá que resolver, con las convenciones como el operador de la tubería se inicia una nueva línea, vamos inicia una nueva línea, la sangría, infijos, prefijos, casos especiales como el (: :) operador y así sucesivamente.

Con todo, factible, pero no es trivial. Algo así como la descompilación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top