2009-09-19 7 views

Respuesta

6

Vas a tener que escribir por sí mismo. Consulte el código F# quotations visualizer como una guía para transformar el árbol de sintaxis abstracta de citas.

0

No hay ninguno, y no es tan fácil, excepto en casos muy simples. Uno de los principales problemas, por ejemplo, es la construcción del partido. Es un azúcar sintáctico para todo un montón de instrucciones if y switch (prueba a imprimir una cita con una coincidencia, verás). Otro de esos biggies son expresiones de cálculo, pero supongo que podrías omitirlos al principio.

Luego hay un agujero en el conejo de ambigüedades que tendrá que resolver, con convenciones como el operador de tuberías comienza una nueva línea, permite comenzar una nueva línea, sangría, infijo, prefijo, casos especiales como el (::) operador y así sucesivamente.

En general, factible, pero no trivial. Algo así como descompilar.

5

Implementé un descompilador de comillas como parte de un proyecto de código abierto más grande, Unquote. Puede descompilar muchas expresiones simples citadas de F # como cadenas de sintaxis no livianas de una sola línea (consulte la página de inicio del proyecto para obtener una lista de las características del decompilador). 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 es correcta acerca de los muchos desafíos que se presentan cuando la descompilación de F # Citas en formato legible por humanos. Pero desde mi trabajo hasta el momento, creo que es posible escribir un descompilador de comillas que puede generar código correcto F #. Tome expresiones de coincidencia y expresiones de cálculo, por ejemplo, la decompilador Unquote puede producir correcta F # código en los siguientes casos sencillos:

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

infijos y prefijos operadores no son demasiado duro (como se puede ver en el primer ejemplo) , pero la estructura de la fuente como las nuevas líneas y la sangría es un tema interesante (aunque no terriblemente difícil, creo). Sin embargo, la sintaxis no luminosa de línea única es suficiente para los requisitos de Unquote.

Cuestiones relacionadas